c# - 使用属性名称调用属性或方法

标签 c# reflection methods properties attributes

假设我有一个看起来像这样的类:

public class CallByAttribute
{
    [CodeName("Foo")]
    public string MyProperty { get; set; }

    [CodeName("Bar")]
    public string MyMethod(int someParameter)
    {
         return myDictionary[someParameter];
    }
}

如何使用 CodeName 而不是属性或方法名称来调用这两个属性或方法?

最佳答案

方法一:

public static TOutput GetPropertyByCodeName<TOutput>(this object obj, string codeName)
{
    var property = obj.GetType()
                      .GetProperties()
                      .Where(p => p.IsDefined(typeof(CodeNameAttribute), false))
                      .Single(p => ((CodeNameAttribute)(p.GetCustomAttributes(typeof(CodeNameAttribute), false).First())).Name == codeName);

    return (TOutput)property.GetValue(obj, null);
}

注意:如果指定的 codeName 不存在任何属性,或者如果多个属性共享相同的 codeName,则会抛出此异常。

用法:

CallByAttribute obj= ...
string myProperty = obj.GetPropertyByCodeName<string>("Foo");

方法二:

如果您使用的是 C# 4,则可以编写自己的 System.Dynamic.DynamicObject可以将动态调用路由到正确的成员。

这将允许更清晰的语法。例如,您应该能够完成允许:

CallByAttribute obj= ...
dynamic objectByCodeName = new ObjectByCodeName(obj);
objectByCodeName.Foo = "8";
objectByCodeName.Bar();

关于c# - 使用属性名称调用属性或方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3706037/

相关文章:

pointers - 反射匿名结构体字段指针

java - 在 Java 方法中更改数组值而不将其传递给方法

c# - 当参数是 C# 中的值或引用类型时调用函数?

c# - 自动更新设置为属性的字典值

c# - 如何将存储过程添加到现有数据库模型(在代码优先方法中)?

c# - 需要协助 : write a small program that will turn on the computer and executes a specified program.

c# - 如何使用 Activator.CreateInstance 来反射(reflect)其构造函数参数仅与 ref 不同的类型

swift - 泛型的最终自类,在方法签名中,在 Swift 中

java - 如何将 arraylist 传递到 onClick 的方法中

java - 如何在 Java 中实现许多类通用的自定义方法?