C# 使用表达式解释泛型方法的用法

C# 使用表达式解释泛型方法的用法,c#,generics,expression,func,C#,Generics,Expression,Func,我想将强类型属性传递给方法,并将此propertyname用作mhy集合的字符串,因此我找到了一些代码,可以在其中传递我的强类型属性: public static void Add<TObject, TProperty>(this NameValueCollection collection, Expression<Func<TObject, TProperty>> expression, string value) { var member = ex

我想将强类型属性传递给方法,并将此propertyname用作mhy集合的字符串,因此我找到了一些代码,可以在其中传递我的强类型属性:

public static void Add<TObject, TProperty>(this NameValueCollection collection, Expression<Func<TObject, TProperty>> expression, string value)
{
    var member = expression.Body as MemberExpression;

    collection.Add(member.Member.Name, value);
}
Expression
是一个表达式树,其签名为委托类型
T
。表达式树很复杂,但基本上是这样的:它不是作为操作的委托,而是一个描述操作的对象模型,可以检查它是如何组成的

因此,
Expression
是一个表达式树,表示接受
TObject
参数并返回
TProperty
结果的内容

至于为什么不需要手动告诉它
:这是泛型类型推断,这是正常的。给定一个通用方法,例如:

void Foo<T>(T bar);
然后,编译器将检查这些参数,看看它是否能够解析所有的泛型类型参数-在这种情况下,
“abc”
是一个
字符串
,并将
T
定位为
字符串
。如果它可以解析所有的,则不需要指定它们

在您的示例中,
TObject
被固定,因为lambda通过
(MyObject)m
显式地获取一个
MyObject
,而
TProperty
被固定(大概)到一个
字符串,因为
m.FullName
(大概)返回一个
字符串。由于所有泛型类型参数都已自动解析,因此无需手动指定

请注意,泛型类型推断仅适用于泛型方法(通过参数),而不适用于泛型类型。

Expression
是具有委托类型
T
签名的表达式树。表达式树很复杂,但基本上是这样的:它不是作为操作的委托,而是一个描述操作的对象模型,可以检查它是如何组成的

因此,
Expression
是一个表达式树,表示接受
TObject
参数并返回
TProperty
结果的内容

至于为什么不需要手动告诉它
:这是泛型类型推断,这是正常的。给定一个通用方法,例如:

void Foo<T>(T bar);
然后,编译器将检查这些参数,看看它是否能够解析所有的泛型类型参数-在这种情况下,
“abc”
是一个
字符串
,并将
T
定位为
字符串
。如果它可以解析所有的,则不需要指定它们

在您的示例中,
TObject
被固定,因为lambda通过
(MyObject)m
显式地获取一个
MyObject
,而
TProperty
被固定(大概)到一个
字符串,因为
m.FullName
(大概)返回一个
字符串。由于所有泛型类型参数都已自动解析,因此无需手动指定


请注意,泛型类型推断仅适用于泛型方法(通过参数),而不适用于泛型类型。

谢谢。我用一种新方法编辑了我的帖子,但是你能解释一下为什么我必须使用Func,为什么我不能使用Action吗?当我使用一个动作时,我会得到一个错误。我的方法中使用的返回值(字符串)在哪里?@Martijn您可以使用Action等;但是一个动作没有返回值;操作版本只能用于引用无效方法,但在这种情况下为什么需要使用Func?谢谢。我用一种新方法编辑了我的帖子,但是你能解释一下为什么我必须使用Func,为什么我不能使用Action吗?当我使用一个动作时,我会得到一个错误。我的方法中使用的返回值(字符串)在哪里?@Martijn您可以使用Action等;但是一个动作没有返回值;操作版本只能用于引用void方法,但在这种情况下为什么需要使用Func?
Foo<string>("abc");
Foo("abc");