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谢谢,忘记了!