我正在谷歌搜索试图找到一种方法来调用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
重命名为Two
,Visual Studio将new { this.One }
重命为new { One = this.Two }
,与GetName
一起使用时函数给了我"One"
,这使得整个事情变得毫无用处,因为我将传递给Control.DataBindings.Add
的名称在重命名属性后仍然是“One”。
答案 0 :(得分:6)
new { this.One }
使用一个属性创建anonymous type的实例,因为您没有指定名称,称为“One”。这就是它起作用的原因。
如果您使用new { One = this.Two }
,则会为该属性命名为“One”。如果你遗漏“One =”这一部分,它会再次起作用。
但是,如果您不知道如何使用该方法并且未使用匿名类型调用它,则您使用的方法可能会被误解。
如果您不想使用字符串文字,还有另一种方法,这是您可以在网上找到的一个示例:
http://www.codeproject.com/Tips/57234/Getting-Property-Name-using-LINQ.aspx
答案 1 :(得分:3)
不,你不必坚持使用字符串文字:
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);