使用变量值设置PropertyName

时间:2012-03-29 06:39:39

标签: c# reflection

我想创建一个类的属性,并使用变量值设置该属性的名称。

E.g。

string resultValue = "stack"; 
MyClass myclass = new MyClass();
myclass.resultValue = "overflow";

现在,在这种情况下,stack是属性名称,"overflow"stack属性的值。

请告诉我们怎么可能。

提前致谢。

7 个答案:

答案 0 :(得分:3)

您可以使用Reflection。例如:

string name = "stack";
string value = "overflow";
PropertyInfo pi = typeof(MyClass).GetProperty(name);
MyClass instance = new MyClass();
pi.SetValue(instance, value, null);
// at this stage instance.stack equals to "overflow"

这显然假设MyClass具有公共设置器的公共属性堆栈:

public class MyClass
{
    public string stack { get; set; }
}

答案 1 :(得分:1)

你应该使用Reflection

MyClass myclass = new MyClass();
Type type = typeof(MyClass);
PropertyInfo property = type.GetProperty("stack");
property.SetValue(myclass, "overflow", null);

答案 2 :(得分:0)

我认为MSDN上的Dynamic Source Code Generation and Compilation部分应该包含您需要的信息。

  

.NET Framework包含一种称为代码文档的机制   对象模型(CodeDOM),使开发人员能够发出的程序   用于生成多种编程语言的源代码的源代码   在运行时,基于代表代码的单个模型   渲染。

我认为您也可以使用Reflection完成此操作。

答案 3 :(得分:0)

我无法想象为什么你想在你的班级上产生财产,但要考虑其他方式。例如。使用Dictionary

class MyClass
{
    Dictionary<string, object> _values = new Dictionary<string, object>();

    public object this[string name]
    {
        get
        {
            if (!_values.ContainsKey(name))
                throw new ArgumentException(name);

            return _values[name];
        }

        set
        {
            if (!_values.ContainsKey(name))
            {
                _values.Add(name, value);
                return;
            }

            _values[name] = value;
        }
    }
}

用法:

MyClass myClass = new MyClass();
myClass["stack"] = "overflow";
Console.WriteLine(myClass["stack"]);

答案 4 :(得分:0)

也许你应该看看DynamicObject。通过这个,您可以通过简单地分配值在运行时创建属性。也可以在MSDN article找到一个示例。

答案 5 :(得分:0)

看看Mark Gravell的FastMember

它允许您以动态方式设置属性。

// obj could be static or DLR 
var wrapped = ObjectAccessor.Create(obj); 
string propName = // something known only at runtime 

FastMember Blog Post

答案 6 :(得分:-1)

据我所知,这是不可能的。您可以尝试使用字典。