C# 使用泛型类型简化构造函数中的属性选择器

标签 c#

如果可能的话,我想简化一些代码。

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/

相关文章:

c# - 在 ReSharper 7 中,是否可以扩展字符串的语法突出显示?

c# - Crystal 报表异常

c# - 从特定文件夹动态加载 DLL?

c# - 消费者的 Amazon Kinesis KCL 客户端无法在 .NET 中运行

c# - Outlook HTMLBody 拒绝输出我指定的字体大小,无论值如何

c# - 运算符的含义?在 C# 中的对象之后

c# - Facebook视频上传异常 "(OAuthException - #1) An unknown error has occurred."

C# 套接字 ReceiveAsync

c# - Visual Studio 运行不需要的代码

c# - UWP:SignTool错误:访问被拒绝。 (解决!)