假设我有一个类如下的基类
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)如果是这样,我该怎么做?
提前致谢
答案 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();