为什么这样做?

时间:2011-01-14 08:47:49

标签: 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 });会给我"One"。我不知道它为什么会起作用以及使用它是否安全。我甚至都不知道new { this.One }的意思。我不知道在properties.Length不是1的情况下会发生哪种情况。

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

2 个答案:

答案 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);