- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我在谷歌上搜索试图找到一种方法来调用 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/
我是一名优秀的程序员,十分优秀!