c# - 为什么这行得通?

标签 c# .net reflection

我在谷歌上搜索试图找到一种方法来调用 Control.DataBindings.Add 而不使用字符串文字但从属性本身获取属性名称,我认为这不太容易出错,位于至少对于我的特殊情况,因为我通常让 Visual Studio 在重命名属性时进行重命名。所以我的代码看起来像 DataBindings.Add(GetName(myInstance.myObject)... 而不是 DataBindings.Add("myObject"...。所以我发现这个:

    static string GetName<T>(T item) where T : class
    {
        var properties = typeof(T).GetProperties();
        if (properties.Length != 1) throw new Exception("Length must be 1");
        return properties[0].Name;
    }

这将被调用,假设我有一个名为 One 的属性,这样:string name = GetName(new { this.One }); 这将给我“一”。我不知道它为什么有效以及使用它是否安全。我什至不知道 new { this.One } 是什么意思。而且我不知道在哪种情况下 properties.Length 不是 1。

顺便说一下,我刚刚测试了将我的属性 One 重命名为 Two 并且 Visual Studio 将 new { this.One } 转换为 new { One = this.Two },当与 GetName 函数一起使用时,我得到了 “One”,这使得整个事情变得毫无用处,因为在重命名属性后,我将传递给 Control.DataBindings.Add 的名称仍然是“一个”。

最佳答案

new { this.One } 创建一个 anonymous type 的实例有一个属性,也就是说,因为你没有指定一个名字,叫做“一个”。这就是它起作用的原因。

如果您使用 new { One = this.Two },您将属性命名为“One”。如果您省略“One =”部分,它将再次起作用。

但是,如果不知道如何使用该方法并且不使用匿名类型调用它,则可能会误解您正在使用的方法。

如果您不想使用字符串文字,还有另一种方法,这是您可以在网上找到的示例之一:
http://www.codeproject.com/Tips/57234/Getting-Property-Name-using-LINQ.aspx

关于c# - 为什么这行得通?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4689338/

相关文章:

c# - 反射获取方法。选择更具体的方法

java - 从 Java 8 迁移到 Java 11 后出现 InaccessibleObjectException

C# 反射匹配类型 List<T> where T IsSubClass(Foo)

c# - 等待持久实体值发生变化

c# - WCF 数据服务更新返回 401-未经授权 : Access is denied due to invalid credentials

c# - 在 C# 中显式引用没有命名空间的类

c# - 如何设置Janus GridEX列索引

.net - 同一进程的两个线程可以产生相同的 GUID 吗?

c# - 仅使用数学函数的规则向上/向下舍入?

.net - 为 Rest Web 服务创建 WCF 代理