如果可能的话,我想简化一些代码。
Current Constructor(T在作用域内,定义在外层类型中)
public Column(string propertyName)
{
PropertyInfo propertyInfo = typeof(T).GetProperty(propertyName);
_ = propertyInfo ?? throw new ArgumentException(message: $"Property {propertyName} does not exist on {typeof(T).Name}");
...
}
我想知道是否可以制作property
一个 Lambda 表达式或其他东西来选择通用类型的属性 T
.
这当然是为了让我们的开发更简单,错误更少。
当前使用情况
new DataTable<someClass>.Column(nameof(someClass.someProperty))
我想做这样的事情:
new DataTable<someClass>.Column(someClass.someProperty)
(不声明新的 someClass
)
或
new DataTable<someClass>.Column(t = > t.someProperty)
最佳答案
您可以使用以下方法从表达式中提取属性名称
public static PropertyInfo GetAccessedMemberInfo<T>(this Expression<T> expression)
{
MemberExpression? memberExpression = null;
if (expression.Body.NodeType == ExpressionType.Convert)
{
memberExpression = ((UnaryExpression)expression.Body).Operand as MemberExpression;
}
else if (expression.Body.NodeType == ExpressionType.MemberAccess)
{
memberExpression = expression.Body as MemberExpression;
}
if (memberExpression == null)
{
throw new ArgumentException("Not a member access", "expression");
}
return memberExpression.Member as PropertyInfo ?? throw new Exception();
}
然后像这样使用它
public Column(Expression<Func<T, object>> prop)
{
PropertyInfo propertyInfo = prop.GetAccessedMemberInfo();
}
new DataTable<someClass>.Column(t = > t.someProperty)
关于C# 使用泛型类型简化构造函数中的属性选择器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60669264/