假设我有一个看起来像这样的类:
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/