c# - 表达式解析 - 可以将属性名称数组作为字符串获取吗?

标签 c# .net expression expression-trees dsl

是否可以完成此方法?在最新版本的 C# 中可以吗?将其视为 DSL 以配置系统以监视特定对象的特定属性更改。

List<string> list = GetProps<AccountOwner>(x => new object[] {x.AccountOwnerName, x.AccountOwnerNumber}); 
// would return "AccountOwnerName" and "AccountOwnerNumber"

public List<string> GetProps<T>(Expression<Func<T, object[]>> exp)
{  
    // code here
}

最佳答案

在 C# 6 中,您将使用:

List<string> list = new List<string>
{
    nameof(AccountOwner.AccountOwnerName),
    nameof(AccountOwner.AccountOwnerNumber)
};

在此之前,您当然可以将表达式树分开 - 最简单的方法可能是使用表达式树可视化工具,或者使用您获得的代码并在方法中放置一个断点(只是让它暂时返回 null)并检查调试器中的表达式树。我敢肯定它不会非常复杂 - 只是比正常的多一点,因为阵列。

你可以使用匿名类型来简化它,如果你使用:

List<string> list = Properties<AccountOwner>.GetNames(x => new {x.AccountOwnerName, x.AccountOwnerNumber});

那么你可以:

public static class Properties<TSource>
{
    public static List<string> GetNames<TResult>(Func<TSource, TResult> ignored)
    {
        // Use normal reflection to get the properties
    }
}

如果你不关心顺序,你可以使用

return typeof(TResult).GetProperties().Select(p => p.Name).ToList();

如果您确实关心顺序,则需要查看 C# 编译器为构造函数参数提供的名称 - 这有点难看。请注意,尽管我们不需要表达式树——我们只需要来自匿名类型的属性名称。 (无可否认,表达式树同样有效。)

关于c# - 表达式解析 - 可以将属性名称数组作为字符串获取吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28330234/

相关文章:

webforms - 为什么在 vs2010 中使用 rdlc Report 绑定(bind)到子对象属性不起作用?

python - 将符号方程解析为 Sympy 函数

c# - 漂亮的、对设计师友好的 GUI 库

c# - 如何将 DataTable 绑定(bind)到 DataGrid

.net - 不应该直接调用垃圾收集器的原因

c# - 如何使表达式将值类型视为引用类型?

c# - 使用 IoC 容器的合适情况?

c# - 如何向结构体添加多个构造函数?

.net - 跨 azure serviceFabric 服务共享文件

.net - 合并 .net 对象图