在扩展方法(C#)中获取类型成员的简单语法
我正在尝试编写一个扩展方法,使用lambda表达式为我提供表示给定类型的成员的在扩展方法(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) 或
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);