`
RednaxelaFX
  • 浏览: 3052864 次
  • 性别: Icon_minigender_1
  • 来自: 海外
社区版块
存档分类
最新评论

通过get或set方法的MethodInfo获得相应的PropertyInfo的方式

    博客分类:
  • DLR
阅读更多
在IronPython 46307的MemberExpression.cs里,可以看到DLR是如何获取一个get或者set方法对应的属性的PropertyInfo的:
/// <summary>
/// Creates a <see cref="MemberExpression"/> accessing a property.
/// </summary>
/// <param name="expression">The containing object of the property.  This can be null for static properties.</param>
/// <param name="propertyAccessor">An accessor method of the property to be accessed.</param>
/// <returns>The created <see cref="MemberExpression"/>.</returns>
public static MemberExpression Property(Expression expression, MethodInfo propertyAccessor) {
    ContractUtils.RequiresNotNull(propertyAccessor, "propertyAccessor");
    ValidateMethodInfo(propertyAccessor);
    return Property(expression, GetProperty(propertyAccessor));
}

private static PropertyInfo GetProperty(MethodInfo mi) {
    Type type = mi.DeclaringType;
    BindingFlags flags = BindingFlags.Public | BindingFlags.NonPublic;
    flags |= (mi.IsStatic) ? BindingFlags.Static : BindingFlags.Instance;
    PropertyInfo[] props = type.GetProperties(flags);
    foreach (PropertyInfo pi in props) {
        if (pi.CanRead && CheckMethod(mi, pi.GetGetMethod(true))) {
            return pi;
        }
        if (pi.CanWrite && CheckMethod(mi, pi.GetSetMethod(true))) {
            return pi;
        }
    }
    throw Error.MethodNotPropertyAccessor(mi.DeclaringType, mi.Name);
}

private static bool CheckMethod(MethodInfo method, MethodInfo propertyMethod) {
    if (method == propertyMethod) {
        return true;
    }
    // If the type is an interface then the handle for the method got by the compiler will not be the 
    // same as that returned by reflection.
    // Check for this condition and try and get the method from reflection.
    Type type = method.DeclaringType;
    if (type.IsInterface && method.Name == propertyMethod.Name && type.GetMethod(method.Name) == propertyMethod) {
        return true;
    }
    return false;
}

这代码太丑了,居然要自己遍历类型的所有属性,线性的一个个找 = =
.NET Framework的标准库怎么就不提供标准的方法来查询一个方法是否是某个属性的get或者set方法呢,属性明明不只是C#的概念,也是CLI的概念啊。看来类似的功能得加到自己的utils里去,不然每次都这么搞太麻烦了。

DLR里有很多扩展方法都值得借鉴,因为光靠.NET标准库提供的方法很多时候还是会重复不少代码的。像是一些对数组的扩展方法就挺不错的。
分享到:
评论

相关推荐

    C#中获取注释信息的实例

    如果想获取更复杂的注释结构,例如参数注释,可以使用`MethodInfo`的`GetParameters`方法获取参数信息,并同样通过`GetCustomAttributes`获取参数的注释。 此外,C#编译器还提供了`doc`命令行选项来生成XML文档文件...

    C# 反射举例 反射实例

    这是通过System.Reflection命名空间中的类实现的,如Type、MethodInfo、PropertyInfo等。 1. **Type类**:它是所有类型的基础类,表示.NET Framework类型的元数据。例如,你可以通过typeof()操作符获取类型信息,如...

    c#中反射示例

    要使用反射,首先需要获取到Type对象,这可以通过`typeof()`操作符或`Activator.CreateInstance()`方法来实现。例如,`typeof(MyClass)`将返回`MyClass`类型的Type对象。 4. **创建实例(Activator.CreateInstance...

    c#反射机制的一种使用

    3. 调用成员:使用`MethodInfo`、`ConstructorInfo`、`PropertyInfo`等对象的方法,如`Invoke()`,在运行时执行相应操作。 现在,让我们回到描述中的主题——将数据库字段与UI控件绑定。假设我们有一个数据库表,...

    C# 利用反射动态创建对象

    例如,通过MethodInfo和PropertyInfo对象,我们可以获取到类的方法和属性信息,然后通过Invoke()方法执行方法或Get、Set方法修改属性值。 总之,反射在C#中提供了一种灵活的方式,使得程序可以在运行时探索和操作...

    反射和自定义特性DEMO

    例如,你可以通过`typeof`关键字获取类型信息,然后使用`GetMethod`或`GetProperty`来查找并调用相应的方法或访问属性。 自定义特性(Custom Attributes)是.NET中的一种元数据机制,它允许开发者在代码元素(如类...

    c# 变量反射使用赋值

    3. `MethodInfo`:表示类的方法信息,用于调用方法。 4. `PropertyInfo`:表示类的属性信息,用于设置和获取属性值。 在WPF应用程序中,我们可能需要动态地改变UI元素的属性,比如TextBlock的Text属性。以下是如何...

    程序集反射特性

    例如,我们可以通过Type类获取任何类型的实例,然后使用MethodInfo、ConstructorInfo和PropertyInfo等类来执行相应的操作。 下面是一个简单的反射示例,展示如何动态调用一个方法: ```csharp using System; using...

    细细品味C#(抽象接口委托反射)(转自博客园)

    通过解析这些概念,旨在帮助读者更好地理解面向对象编程中多态性的实现方式,并掌握如何在实际开发中有效地运用抽象类与抽象方法。 **抽象类简介** 抽象类是一种特殊的类,它主要用于作为其他类的基类,不能被直接...

    .net反射与特性的使用方法

    反射通过System.Reflection命名空间中的类来实现,如Type、MethodInfo、PropertyInfo等。下面是一段简单的反射示例: ```csharp using System; using System.Reflection; public class MyClass { public void ...

    C#反射简单入门实例

    对于字段,我们使用GetField和SetField方法(在.NET Core和.NET 5及以上版本中已被废弃,推荐使用GetProperty和SetField)。示例: ```csharp FieldInfo field = myType.GetField("MyField"); field.SetValue(new...

    c# 反射多线程

    通过反射,程序员可以在不知道具体类型的情况下创建对象、调用方法、获取或设置字段值等。 **1.2 反射的应用场景** - **动态创建对象**:无需提前知道对象的具体类型即可创建。 - **调用方法**:可以在运行时根据...

    C#反射.zip

    2. 动态方法调用:无需预先知道方法名称,可以根据字符串或其他标识调用方法。 3. 访问私有和受保护的成员:反射可以用来访问通常不可见的类成员。 4. 序列化和反序列化:用于将对象转换为字节流和从字节流恢复对象...

    asp.net教程-.Net中的反射使用入门

    反射中常用的子类有FieldInfo(字段)、PropertyInfo(属性)、MethodInfo(方法)、ConstructorInfo(构造函数)、EventInfo(事件)等。 #### 三、反射的基本操作 ##### 3.1 加载程序集 反射的第一步通常是加载...

    ReflexProperty(通过反射出属性值)

    要通过反射获取属性信息,首先需要得到类型实例,然后调用`Type`对象的`GetProperty()`方法。这个方法接受属性名作为参数,可选地接受一个`BindingFlags`枚举值来指定搜索条件。例如: ```csharp Type myType = ...

    C# 反射原理

    这主要通过System.Reflection命名空间中的类来实现,如Type、MethodInfo、PropertyInfo等。例如,当你有一个对象实例,你可以通过反射获取它的类型信息,查找并调用其私有或受保护的方法,甚至在运行时发现并加载...

    CodeDom示例(c#)

    通过`System.Reflection`命名空间提供的类,如`Type`、`MethodInfo`、`PropertyInfo`等,我们可以获取类型信息、调用方法、访问属性和字段,甚至创建动态类型实例。 在本示例中,`ClassGenerator`可能是实现CodeDom...

    C#头脑风暴_反射

    此命名空间提供了一系列用于处理反射操作的类和接口,比如`Type`、`Assembly`、`MemberInfo`、`MethodInfo`、`PropertyInfo`、`FieldInfo`、`EventInfo`等。 #### 三、反射调用示例 接下来,我们将基于给定的部分...

    反射和序列化的几个简单示例

    1. **获取类型信息**:`Type` 类型代表.NET中的任何类型,你可以通过`typeof()`操作符或`object.GetType()`方法获取类型信息。例如: ```csharp Type myType = typeof(MyClass); ``` 2. **创建实例**:使用`...

Global site tag (gtag.js) - Google Analytics