【问题标题】:Get string path properties from object path clearly in C#在 C# 中清楚地从对象路径获取字符串路径属性
【发布时间】:2021-12-21 17:25:18
【问题描述】:

我需要得到这个结果:

ProgrammeEtude.Description

所以,我做了类似的事情,它工作了

modelMember = $"{nameof(Gabarit.ProgrammeEtude)}.{nameof(Gabarit.ProgrammeEtude.Description)}";

但它很丑陋,如果我们要达到一个以上的类,它就不会是干净的。所以,我想知道是否可以创建一个函数来获取 fullName 属性,而无需清楚地了解第一类。仅通过调用函数

// Like that
modelMember = typeof(ProgrammeEtude).GetPropertyFullName(nameof(ProgrammeEtude.Description));

// Or like that
modelMember = GetPropertyFullName(ProgrammeEtude.Description);

谢谢!

Ecoron 提供的最终解决方案帮助:

public void Test1()
        {
            var result = NameOf<Gabarit>(x => x.ProgrammeEtude.Description);

        }

        public static string NameOf<T>(Expression<Func<T, object>> selector)
        {
            return string.Join(".", selector.ToString().Split('.').Skip(1));

        }

【问题讨论】:

  • 没有“属性的全名”这样的概念——所以无论你想实现什么,你都必须自己写。请注意,真正的“全名”可能应该包括完整的命名空间和程序集名称/版本以匹配类“全名”。另一方面,您似乎已经有了一种方法来实现您想要的,并正在寻找一些语法糖来以不同的方式编写它 - 请edit 提问以澄清您的问题/目标。

标签: c# properties classname


【解决方案1】:

你可以在运行时做:

public class SomeClass
{
    public SomeClass Other;
}

public class Tests
{
    [Test]
    public void Test1()
    {
        var result = NameOf<SomeClass>(x => x.Other.Other.Other);
    }

    public static string NameOf<T>(Expression<Func<T,object>> selector)
    {
        const string joinWith = ".";
        return nameof(T) + joinWith + string.Join(joinWith, selector.ToString().Split('.').Skip(1));
    }
}

结果:SomeClass.Other.Other.Other

您可以使用此功能来获得所需的结果 - 使用/输出命名空间/索引/分隔选择只是开始或结束或跳过某些内容等。

请注意,只有当您不使用一些通过点访问的时髦变量/枚举时,这才有效。对于更正确的版本,您应该自己遍历表达式,但在这个例子中,我只是有点懒得写这一切,最好使用简单的方法。

【讨论】:

  • return String.Join(".", typeof(T).Name, selector.Body.ToString().Substring(selector.Parameters[0].Name.Length+1))NameOf 中破解相同的内容 :)
  • 非常感谢。它工作。
  • @cly,是的,你的版本更优化
猜你喜欢
  • 2015-04-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多