C#访问对象属性索引器样式

时间:2011-05-12 08:48:57

标签: c#

是否有任何工具,库可以让我访问我的对象属性索引器样式?

public class User
{
    public string Name {get;set;}
}

User user = new User();
user.Name = "John";

string name = user["Name"];

也许动态关键词可以帮助我吗?

6 个答案:

答案 0 :(得分:10)

您可以使用反射按名称

获取属性值
   PropertyInfo info = user.GetType().GetProperty("Name");
   string name = (string)info.GetValue(user, null);

如果你想为此使用索引,你可以尝试类似的东西

    public object this[string key]
    {
        get
        {
             PropertyInfo info = this.GetType().GetProperty(key);
             if(info == null)
                return null
             return info.GetValue(this, null);
        }
        set
        {
             PropertyInfo info = this.GetType().GetProperty(key);
             if(info != null)
                info.SetValue(this,value,null);
        }
    }

答案 1 :(得分:3)

查看有关索引器的this。字典存储所有值和键而不是使用属性。这样,您可以在运行时添加新属性而不会降低性能

public class User
{
    Dictionary<string, string> Values = new Dictionary<string, string>();
    public string this[string key]
        {
            get
            {
                return Values[key];
            }
            set
            {
                Values[key] = value;
            }
        }
}

答案 2 :(得分:2)

您当然可以继承DynamicObject并以此方式执行。

http://msdn.microsoft.com/en-us/library/system.dynamic.dynamicobject.trygetindex.aspx

使用其他人提到的简单索引器方法会限制您只返回'object'(并且必须转换)或者只在类中使用字符串类型。

编辑:如其他地方所述,即使使用动态,您仍然需要使用反射或某种形式的查找来检索TryGetIndex函数中的值。

答案 3 :(得分:1)

在类实现Indexer之前,你不能这样做。

答案 4 :(得分:1)

如果您只想根据字符串值访问属性,可以使用反射来执行类似的操作:

string name = typeof(User).GetProperty("Name").GetValue(user,null).ToString();

答案 5 :(得分:0)

您可以使用反射和索引器自行构建它。

但是你需要这样的解决方案呢?