推断泛型类型从一个方法到另一个
我正在寻找一种方式来做到这一点:推断泛型类型从一个方法到另一个
var instanceOfMyClass = new MyClass();
instanceOfMyClass.AMethod<AType>(x => x.AnotherMethod(y => y.PropertyOfATypeClass));
我能做到这一点,但我需要明确指定类型的另一个类,像这样:
instanceOfMyClass.AMethod<AType>(x => x.AnotherMethod<AType>(y => y.PropertyOfATypeClass));
有没有办法做到这一点,而不需要重写AType?
的AnotherMethod签名,这时,是:
AnotherMethod<T>(Expression<Func<T, object>>)
其中该
<T>
将是相同的A型从 “amethod方法”
的 “AnotherMethod” 中的定义与“AMethod”同级。
我需要AMethod的签名。
看来您已经遇到了C#类型推理引擎的一个限制。
问题的关键在于,在方法组类型推断的一般情况下,为了对采用泛型委托的方法的参数进行类型推断,编译器需要知道方法签名(以确定哪个代表类型有重载);但要确定方法签名,它需要知道委托参数的类型。因此,编译器有可能进入循环过程。为了避免这种情况,编译器甚至不会尝试进行推理。
一个更加准确,详细和完善的书面说明,see this blog post.
我认为简单的答案是,没有,没有办法,以避免重新指定泛型类型。
虽然它的一部分取决于他的代码的结构。很明显,它不适合他,但我想知道他是否可以重构他的代码以允许推理引擎为他工作(尽管我们需要先看他的代码......) –
请注意,我们做了一些改进这个算法在C#4中。我应该更新该博客文章来澄清。也就是说,我同意在这种情况下,这个问题不能通过类型推断来解决。 –
请提供'MyClass.AMethod','MyOtherClass.AnotherMethod','MyOtherOtherClass.PropertyofATypeClass'的签名(我不知道“MyOtherClass”和“MyOtherOtherClass”类型的名称实际上是因为我可以在你的lambda表达式中不会告诉'x'和'y'的类型)。 – jason
AMethod()将参数定义为什么? –
泛型类型推断基于参数 - 我们需要一个非常明确的例子来看... –