推断泛型类型从一个方法到另一个

问题描述:

我正在寻找一种方式来做到这一点:推断泛型类型从一个方法到另一个

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的签名。

+3

请提供'MyClass.AMethod','MyOtherClass.AnotherMethod','MyOtherOtherClass.PropertyofATypeClass'的签名(我不知道“MyOtherClass”和“MyOtherOtherClass”类型的名称实际上是因为我可以在你的lambda表达式中不会告诉'x'和'y'的类型)。 – jason

+0

AMethod ()将参数定义为什么? –

+1

泛型类型推断基于参数 - 我们需要一个非常明确的例子来看... –

看来您已经遇到了C#类型推理引擎的一个限制。

问题的关键在于,在方法组类型推断的一般情况下,为了对采用泛型委托的方法的参数进行类型推断,编译器需要知道方法签名(以确定哪个代表类型有重载);但要确定方法签名,它需要知道委托参数的类型。因此,编译器有可能进入循环过程。为了避免这种情况,编译器甚至不会尝试进行推理。

一个更加准确,详细和完善的书面说明,see this blog post.

我认为简单的答案是,没有,没有办法,以避免重新指定泛型类型。

+0

虽然它的一部分取决于他的代码的结构。很明显,它不适合他,但我想知道他是否可以重构他的代码以允许推理引擎为他工作(尽管我们需要先看他的代码......) –

+0

请注意,我们做了一些改进这个算法在C#4中。我应该更新该博客文章来澄清。也就是说,我同意在这种情况下,这个问题不能通过类型推断来解决。 –