【问题标题】:Simple syntax for getting a member of a type in extension method (C#)在扩展方法 (C#) 中获取类型成员的简单语法
【发布时间】:2010-07-24 11:06:34
【问题描述】:

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

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

或者,也可以接受

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

甚至

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

我有一个有效的通用方法签名,但需要我指定所有类型参数,我非常希望 C# 来推断它们。据我所知,如果我只是找到指定扩展方法签名的正确方法,那么(至少最后一个)代码 sn-ps 中应该有足够的信息来推断一切 - 但根据编译器,没有。

我读过an old blog post on static extension methods,但我找不到比这更近的东西。如果是真的,我就可以写了

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

这将解决我的问题。但正如我所说,我似乎被实例扩展卡住了,在这种情况下

public static MemberInfo GetMember<TType, TReturnType>(this Type t, Expression<Func<TType, TReturnType>> member)

只是不足以让编译器推断类型成员。

【问题讨论】:

    标签: c# static generics


    【解决方案1】:

    这个怎么样:

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

    然后你会这样称呼它:

    default(MyType).GetMember(m => m.MyProperty)
    

    这有点麻烦,但使用default(MyType) 是获取MyType 类型表达式的一种简单而有效的方法,这正是您想要的类型推断。

    【讨论】:

    • 使用default(MyType)实际上并不比使用typeof(MyType)更恶心,所以它绝对是一个很好的解决方案。您知道是否会为任何未来版本的框架考虑静态扩展方法?
    • 但是好吧,我又卡住了:当我有这个表达式时,我如何获得我正在寻找的实际MemberInfo?我正在尝试提取我输入的成员的名称(从m.MyProperty"MyProperty")以使用内置的GetMember 方法并获取该成员,但我找不到正确的属性lambda 表达式...
    • @Tomas:查看表达式树,您会找到一个 MemberExpression,它指定要使用的属性。我现在不能给你一个样本,但基本上你需要分解表达式树中的内容,直到找到你要找的东西。
    • 找到了!我需要((MemberExpression)member.Body).Member。它的名称可以在Name 属性中找到,但由于我已经拥有MemberInfo,因此无需通过内置方法。谢谢!
    【解决方案2】:

    如果你没有实例,我认为你能做的最好的就是:

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

    然后像这样使用:

    MemberInfo info = YourClass.GetMember((YourConcreteType instance) => instance.Property);
    

    您可以保留一个将实例作为第一个参数的重载,因此只要有实例,您就可以使用扩展方法语法:

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

    然后像这样使用:

    MemberInfo info = yourInstanceOfTType.GetMember(instance => instance.Property);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-12
      • 1970-01-01
      • 2020-04-15
      • 2013-05-24
      • 1970-01-01
      • 2013-11-20
      • 2016-02-13
      • 2014-04-26
      相关资源
      最近更新 更多