使用表达式树在2个不相关的类上调用具有相同名称的方法

时间:2017-09-01 16:54:45

标签: c# lambda expression-trees linq-expressions

假设我有一个类如下的基类

public abstract class BaseHelloWorld<T> where T : BaseEntity
{
    public abstract IEnumerable<T> DoSomething();
}

和另一个像

public class BaseEntity
{
    public abstract void DoSomethingInPayload();
}

然后我有4个类,如:

public class Payload1 : BaseEntity
{
    public override void DoSomethingInPayload()
    {
        Console.Write("Hello world");
    }
}

public class Class1 : BaseHelloWorld<Payload1>
{
    public override IEnumerable<Payload1> DoSomething()
    {
        return new List<Payload1> {  };
    }
}   

public class Payload2 : BaseEntity
{
    public override void DoSomethingInPayload()
    {
        Console.Write("Goodbye world");
    }
}

public class Class2 : BaseHelloWorld<Payload2>
{
    public override IEnumerable<Payload2> DoSomething()
    {
        return new List<Payload2>() { };
    }
}

虽然我在这里显示了代码,但假设这些代码中我没有代码的第三方库,我想扩展它们。我想要做的是能够创建一个单一的扩展方法,允许我在有效负载类上调用DoSomethingInPayload()方法,类似于

public static void CallDoSomething<T>(this BaseHelloWorld<T> theClass) where T: BaseEntity
{
    theClass.DoSomethingInPayload();
}

显然这不起作用所以我开始查看表达式树。我的阅读表明这可能与表达树有关,但我无法弄明白。经过几个小时的尝试和无处可去,我不确定我的理论是否正确。因此,请你告诉我:

A)是否可以使用表达式树来完成此操作  B)如果是这样,我该怎么做?

提前致谢

1 个答案:

答案 0 :(得分:1)

您自己的示例无效,因为T在输入和返回参数中是不同的类型。

事实上,正如@AleksAdreev所提到的,你可以尝试:

public static IEnumerable<T> CallDoSomething<T>(this BaseHelloWorld<T> theClass)
{
    return theClass.DoSomething();
}

然后可以按如下方式调用:

var someClass = new Class2();
var someResult = someClass.CallDoSomething();
相关问题