【发布时间】:2015-02-26 17:49:36
【问题描述】:
代码:
objectType request = factory.create<objectType>();
public class factory
{
public static T create<T>() where T : new()
{
T obj = new T();
PropertyInfo propertyInfo = obj.GetType().GetProperty("client_no");
propertyInfo.SetValue(obj, CLIENT_NUMBER, null);
return (T)Convert.ChangeType(obj, typeof(T));
}
}
解释:
我正在创建一个设置 2 个对象属性的通用工厂 fn()。
这些属性在我要初始化的所有对象中都是一致的。
1) 我如何调用我的函数
objectType request = factory.create<objectType>(); // <-- This works
1b) 如果需要,我可以从这里执行以下操作,但这是在我的所有对象中重复的额外代码
request.client_no = CLIENT_NUMBER;
2) 下面是我的工厂 fn()
public static T create<T>() where T : new()
{
T obj = new T();
// Here is where I am having trouble setting client_no I will explain in #3
return (T)Convert.ChangeType(obj, typeof(T)); // <-- This works returns generic type
}
3) 我尝试过 PropertyInfo 来设置对象属性如下
PropertyInfo propertyInfo = obj.GetType().GetProperty("client_no");
propertyInfo.SetValue(obj, CLIENT_NUMBER, null);
我也试过this
obj.GetType().GetProperty("client_no").SetValue(obj, CLIENT_NUMBER, null);
我试过了
T obj = new T();
var t = typeof(T);
var prop = t.GetProperty("client_no");
prop.SetValue(obj, CLIENT_NUMBER);
4) 这是我收到的错误
对象引用未设置为对象的实例
更多/更新信息:
所以随着进一步的研究。第 3 方对象属性没有 getter 和 setter {get; set;} 这就是 GetType() 和 SetValue() 不起作用的原因。
我的同事指出该物业是一个单一的分配 这就是为什么我们可以这样做
request.client_no = CLIENT_NUMBER;
所以我的问题是如何设置这些属性?
【问题讨论】:
-
真的不清楚你的
updateAccountData方法的目的是什么。您不能在 C# 中动态创建变量...如果您告诉我们更多关于您实际想要实现的目标,我们可以为您提供更多帮助。 -
那么你的班级
objectName有你想要填充的属性吗?还是认为这些属性不存在?你最终希望用request做什么? -
@MattBurland 他们会拥有它,或者我可以在添加项目之前添加一个选项来测试它们是否存在。
-
@Demodave 不容易理解。我们都在猜测你想做什么。
-
@Demodave 我不知道你想在这里实现什么,但如果你认为你需要在对象上动态创建新属性,那么你的角度是错误的。见:XY Problem
标签: c# dynamic generic-programming