【发布时间】:2014-11-28 15:44:14
【问题描述】:
我正在尝试通过使用反射来填充几个类的属性,以将默认值分配给它们的所有属性。
这主要是通过使用 PropertyInfo.Setvalue(instance, value) 来完成的。但是,当该属性具有特定类的列表时,我遇到了问题。直到运行时我才知道该类类型。
要创建该列表并返回到 SetVaule() 设置,我正在执行以下操作:
private static IEnumerable<object> CreateAListContainingOneObject(Type type)
{
var listType = typeof(List<>).MakeGenericType(new Type[] { type });
var generic = Activator.CreateInstance(listType);
var dynamicList = generic as dynamic;
var instance = new MySpecialType();
var instance2 = Activator.CreateInstance(type);
var typecheck = instance.GetType() == instance2.GetType();
dynamicList.Add(instance);
dynamicList.Add(instance2);
return dynamicList;
}
我已经尝试了几个选项,但是这里列出的一个特别有趣,因为当运行时类型检查将为真,第一个 Add 将起作用,但第二个将失败,告诉我“最好的重载方法 'Add(. ...)' 有一些无效的参数”。
PS。该列表必须是 MyType 的列表,否则我将无法通过 SetVaule() 将其值设置为属性。使用新的对象列表并添加我新实例化的 myType 类型的对象将不起作用。
编辑:我没有使用泛型方法来调用我可以实例化已知类型的原因是因为我在从我的基类继承的一系列类上执行此操作。他们有各种各样的属性,我不知道也不想为每个类和它可以拥有的每个属性编写代码。 调用来自以下内容:
public static ABaseClass FillObjectWithDefaults(this ABaseClass myObject)
{
var properties = myObject.GetType().GetProperties();
foreach (var p in properties)
{
var value = FindValue(p);
p.SetValue(template, value);
}
return template;
}
【问题讨论】:
标签: c# generics reflection