C# 使用变量值设置PropertyName

C# 使用变量值设置PropertyName,c#,reflection,C#,Reflection,我想创建一个类的属性,并使用变量值设置该属性的名称 例如 现在,在本例中,stack是属性名,“overflow”是stack属性的值 请告诉我怎么可能 提前谢谢。据我所知,这是不可能的。你可以试着用字典。据我所知,这是不可能的。你可以试着用字典。你可以用。例如: string name = "stack"; string value = "overflow"; PropertyInfo pi = typeof(MyClass).GetProperty(name); MyClass instan

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

例如

现在,在本例中,
stack
是属性名,
“overflow”
stack
属性的值

请告诉我怎么可能


提前谢谢。

据我所知,这是不可能的。你可以试着用字典。据我所知,这是不可能的。你可以试着用字典。

你可以用。例如:

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
有一个带有公共setter的公共属性堆栈:

public class MyClass
{
    public string stack { get; set; }
}
你可以用。例如:

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
有一个带有公共setter的公共属性堆栈:

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

对此,您应该使用反射

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

对此,您应该使用反射

MyClass myclass = new MyClass();
Type type = typeof(MyClass);
PropertyInfo property = type.GetProperty("stack");
property.SetValue(myclass, "overflow", null);
我认为MSDN部分应该包含您需要的信息

NET框架包括一种称为代码文档的机制 对象模型(CodeDOM),使程序开发人员能够 源代码以多种编程语言生成源代码 在运行时,基于表示要执行的代码的单个模型 渲染

我认为您也可以使用。我认为MSDN部分应该包含您需要的信息

NET框架包括一种称为代码文档的机制 对象模型(CodeDOM),使程序开发人员能够 源代码以多种编程语言生成源代码 在运行时,基于表示要执行的代码的单个模型 渲染


<>我想你也可以用.

来完成这一点。我无法想象你为什么要在你的类上生成属性,但是考虑其他的方法。例如,使用
词典

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;
        }
    }
}

我无法想象为什么要在类上生成属性,但是考虑其他方法。例如,使用
词典

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;
        }
    }
}

也许你应该看看。有了它,您可以通过简单地赋值在运行时创建属性。还可以在上找到一个示例。

也许您应该看看。有了它,您可以通过简单地赋值在运行时创建属性。还可以在上找到一个示例。

查看Mark Gravell的
FastMember

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

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

看看马克·格雷威尔的
快速会员

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

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

instance.stack=value之间的区别是什么?区别在于编译时不必知道变量的名称。无论如何,您需要检查
pi!=按名称获取后为空。奇怪。。问题是关于生成属性,而不是通过名称进行访问。instance.stack=value之间的区别是什么?区别在于您不必在编译时知道变量的名称。无论如何,您需要检查
pi!=按名称获取后为空。奇怪。。问题是关于生成属性,而不是通过名称访问。@hamad也许Mariusz不知道反射,那个么他并没有撒谎!:)@Bazzz:)那么没有研究和适当的回答是不应该的understanding@hamad也许马吕斯不知道反思,那么他就没有撒谎!:)@Bazzz:)那么,如果没有研究和正确理解,就不应该回答为什么要生成属性?为什么要生成属性?您可以跳过
set
方法中的整个
if
子句,因为
\u values[name]=value
在不存在的情况下添加键。@ChrisWue谢谢,忘记了!您可以跳过
set
方法中的整个
if
子句,因为
\u values[name]=value
会在不存在时添加键。@ChrisWue谢谢,忘记了!