1 回答
TA贡献1859条经验 获得超6个赞
对我而言,所有这些结构总体上似乎很疯狂且过于复杂。
考虑重写整个方法而不是改变GetKey方法。
一般来说,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);
是的,它让每次GetKey调用看起来更长,但它分离了这个逻辑并使你的意图清晰。
万一您有对象的实例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);
- 1 回答
- 0 关注
- 216 浏览
添加回答
举报