gpt4 book ai didi

c# - 继承时的表达式推断

转载 作者:太空宇宙 更新时间:2023-11-03 19:37:54 25 4
gpt4 key购买 nike

我有以下代码:

using System;
using System.Linq;
using System.Linq.Expressions;

public class Program
{
public static void Main()
{
Descendant d = new Descendant();
d.TestMethod();
}
}

public class Base
{
protected void FigureItOut<TClass, TMember>(Expression<Func<TClass, TMember>> expr)
{

}
}

public class Descendant : Base
{
public void TestMethod()
{
FigureItOut(c => c.Name);
}

public String Name { get; set; }
}

我收到此编译器错误消息:

The type arguments for method
'Base.FigureItOut<TClass,TMember>
(System.Linq.Expressions.Expression<System.Func<TClass,TMember>>)'
cannot be inferred from the usage. Try specifying the type arguments explicitly.

如果我将对 FigureItOut 的调用更改为:

FigureItOut((Descendant c) => c.Name);

然后就可以了。有没有办法通过更改基类来编译第一个示例?

我知道如果我将整个 Base 类设为泛型,就像这样:

public class Base<TDescendant>
{
protected void FigureItOut<TMember>(Expression<Func<TDescendant, TMember>> expr)
{

}
}

public class Descendant : Base<Descendant>
{
public void TestMethod()
{
FigureItOut(c => c.Name);
}

public String Name { get; set; }
}

然后它就可以工作了,但我宁愿不这样做,可以使用任何其他 hack,也许在方法级别(即以某种方式更改 FigureItOut)。

最佳答案

调用实际(protected internal)实现的扩展方法怎么样?唯一的缺点是您必须添加 this..

这是有效的,因为 source 参数(通过 this)推断出 TClass 的类型。

public class Base
{
protected internal void FigureItOut<TClass, TMember>(Expression<Func<TClass, TMember>> expr)
{
Debug.WriteLine("Got to actual method");
}
}

public static class BaseExt
{
public static void FigureItOut<TClass, TMember>(this TClass source, Expression<Func<TClass, TMember>> expr)
where TClass : Base
{ // call the actual method
Debug.WriteLine("Got to extension method");
source.FigureItOut(expr);
}
}
public class Descendant : Base
{
public void TestMethod()
{
this.FigureItOut(c => c.Name);
}

public String Name { get; set; }
}

作为替代方案(如果 internal 很痛苦),考虑将其设为静态,并使用主要用于类型推断的实例参数:

protected static void FigureItOut<TClass, TMember>(TClass source, Expression<Func<TClass, TMember>> expr)
{

}

public void TestMethod()
{
FigureItOut(this, c => c.Name);
}

关于c# - 继承时的表达式推断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/261709/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com