繁体   English   中英

为什么这样做?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM