Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在扩展方法(C#)中获取类型成员的简单语法_C#_Static_Generics - Fatal编程技术网

在扩展方法(C#)中获取类型成员的简单语法

在扩展方法(C#)中获取类型成员的简单语法,c#,static,generics,C#,Static,Generics,我正在尝试编写一个扩展方法,使用lambda表达式为我提供表示给定类型的成员的MemberInfo。理想情况下,我希望能够写作 var info = MyType.GetMember(m => m.MyProperty); public static MemberInfo GetMember<TType, TReturnType>(static TType, Expression<Func<TType, TReturnType>> member) 或

我正在尝试编写一个扩展方法,使用lambda表达式为我提供表示给定类型的成员的
MemberInfo
。理想情况下,我希望能够写作

var info = MyType.GetMember(m => m.MyProperty);
public static MemberInfo GetMember<TType, TReturnType>(static TType, Expression<Func<TType, TReturnType>> member)
或者,也可以接受

var info = typeof(MyType).GetMember(m => m.MyProperty);
甚至

var info = typeof(MyType).GetMember((MyType m) => m.MyProperty);
我有一个通用的方法签名可以工作,但需要我指定所有类型参数,我非常希望C#能够推断出它们。就我所见,如果我只是找到了正确的方法来指定扩展方法签名,那么代码片段(至少最后一个)中应该有足够的信息来推断一切——但根据编译器的说法,没有

我读过,但没有比这更新的了。如果那成为现实,我就能写作了

var info = MyType.GetMember(m => m.MyProperty);
public static MemberInfo GetMember<TType, TReturnType>(static TType, Expression<Func<TType, TReturnType>> member)
publicstaticmemberinfo GetMember(staticttype,expressionmember)
这会解决我的问题。但正如我所说,我似乎被实例扩展卡住了,在这种情况下

public static MemberInfo GetMember<TType, TReturnType>(this Type t, Expression<Func<TType, TReturnType>> member)
publicstaticmemberinfo GetMember(此类型为t,表达式成员)
对于编译器来说,这还不够好,无法推断类型成员。

这样如何:

public static MemberInfo GetMember<TType, TReturnType>
    (this TType ignored,
     Expression<Func<TType, TReturnType>> expression)

这有点令人讨厌,但是使用
default(MyType)
是一种简单而有效的方法,可以获得类型
MyType
的表达式,这就是您想要的类型推断。

如果您没有实例,我想您最好能做的是:

public static MemberInfo GetMember<TType, TReturnType>(Expression<Func<TType, ReturnType>> member)
您可以保留一个以实例作为第一个参数的重载,以便在有实例时使用扩展方法语法:

public static MemberInfo GetMember<TType, TReturnType>(this TType instance, Expression<Func<TType, ReturnType>> member)

使用
default(MyType)
实际上并不比使用
typeof(MyType)
更令人讨厌,所以这绝对是一个好的解决方案。你知道该框架的未来版本是否会考虑使用静态扩展方法吗?但是,好吧,我又一次陷入了困境:当我有了这个表达式时,我如何获得我要寻找的实际
MemberInfo
?我试图提取我输入的成员的名称(从
m.MyProperty
“MyProperty”
),以使用内置的
GetMember
方法获取成员,但我找不到lambda表达式的正确属性…@Tomas:查看表达式树,您将找到一个MemberExpression,它指定要使用的属性。我现在不能给你一个示例,但是基本上你需要分解表达式树中的内容,直到你找到你想要的。找到了!我需要
((MemberExpression)member.Body.member
。它的名称可以在
name
属性中找到,但是因为我已经有
MemberInfo
了,所以不需要使用内置方法。谢谢
MemberInfo info = yourInstanceOfTType.GetMember(instance => instance.Property);