对于我来说,所有这些结构总体上似乎都是疯狂和过于复杂的。
考虑重写整个方法,而不是更改
GetKey
方法。
一般来说,
盖奇
在你的基类中打破了单一的责任原则。
如果必须这样做,我将把这个功能提取到一个静态类中:
public static class CustomKeysHelper
{
public static string GetKey<T>(Expression<Func<T, object>> property) where T : BaseClass
{
var memberInfo = GetMemberInfo(property);
return GetAttributeKey(memberInfo) ?? memberInfo?.Name;
}
private static MemberInfo GetMemberInfo<T>(Expression<Func<T, object>> property) =>
(property.Body as MemberExpression ?? ((UnaryExpression)property.Body).Operand as MemberExpression)?.Member;
private static string GetAttributeKey<T>(MemberInfo member) =>
member.GetCustomAttributeValue<string>(typeof(MyAttribute), "Key");
}
// Usage:
string cKey = CustomKeysHelper.GetKey<DerivedClassA>(dca => dca.PropertyC);
是的,它使
盖奇
呼叫看起来更长,但它分离了这一逻辑,并使您的意图明确。
以防万一你有对象的实例
BaseClass
并且要从实例中提取属性名,而不是类型,则可以使用扩展方法:
public static class CustomKeysHelper
{
// ... see above
public static string GetKey<T>(this T obj, Expression<Func<T, object>> property) where T : BaseClass
{
return GetKey<T>(property);
}
}
// Now, you can do this:
DerivedClassA derAInstance = ...;
derAInstance.GetKey(dca => dca.PropertyC);