[英]Why does this work?
我正在谷歌搜索试图找到一种方法来调用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 });
这会给我"One"
。 我不知道它为什么会起作用以及使用它是否安全。 我甚至不知道new { this.One }
意味着什么。 我不知道在哪种情况下会发生properties.Length
不是1。
顺便说一句,我刚测试将我的属性重命名为One
to Two
,Visual Studio将new { this.One }
转换为new { One = this.Two }
,当与GetName
函数一起使用时,我给了"One"
,这使得整个事情没用,因为我将传递给Control.DataBindings.Add
的名称在重命名属性后仍然是“One”。
new { this.One }
使用一个Property创建一个匿名类型的实例,因为您没有指定名称,称为“One”。 这就是它的原因。
如果您使用new { One = this.Two }
, new { One = this.Two }
该属性命名为“One”。 如果你遗漏“One =”这一部分,它会再次起作用。
但是,如果您不知道如何使用它并且如果不使用匿名类型调用它,则您使用的方法可能会被误解。
如果您不想使用字符串文字,还有另一种方法,这是您可以在网上找到的示例之一:
http://www.codeproject.com/Tips/57234/Getting-Property-Name-using-LINQ.aspx
不,你不必坚持字符串文字:
public static class ControlBindingsCollectionExtensions
{
public static void Add<T>(this ControlBindingsCollection instance, Expression<Func<T, object>> property)
{
var body = property.Body as UnaryExpression;
var member = body.Operand as MemberExpression;
var name = member.Member.Name;
instance.Add(name);
}
}
用法:
Control.DataBindings.Add<MyClass>(m => m.MyProperty);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.