我正在使用.NET Framework 3.5 我需要在C#中创建一个方法,该方法可以接受5种类型中的一种,并使用传递给该方法的类类型动态生成对象。因此,此方法基本上有2个输入。一种是类的类型,另一种是我需要用来填充对象的数据对象。 调用该方法后,它应自动创建一个我发送的类类型的对象,并用我发送的数据对象填充字段。 我尝试使用System.reflection的createinstance,并获得了具有所需类的对象,但是,我感到震惊的是,我必须用我拥有的数据对象填充字段。非常感谢您的帮助。
Edit : `public class DataInput
{
public string field1 { get; set; }
public string field2 { get; set; }
public string field3 { get; set; }
public string field4 { get; set; }
public DateTime field5 { get; set; }
public DateTime field6 { get; set; }
}
My 5 classes look like this :
public class Class1
{
public string field1;
public string field2;
public string field3;
public string field4;
public DateTime field5;
}
public class Class2
{
public string field1;
public string field2;
public string field3;
}
public class Class3
{
public int field1;
public string field2;
public string field3;
}
public class Class4
{
public int field1;
public string field2;
public string field3;
public DateTime field4;
}
public class Class5
{
public int field1;
public DateTime field2;
public string field3;
}
public void Convert(DataInput ratCommon, Type type1)
{
var type = Type.GetType(type1.AssemblyQualifiedName.ToString());
if (type != null)
{
Object obj = Activator.CreateInstance(type); //This creates an instance with type I passed, but I am struck here
}
}
I combined @Fabjan answer and @striplingwarrior answer and got the result. I can't thank you enough....
答案 0 :(得分:0)
我感到震惊的是,我必须用我拥有的数据对象填充字段。
这是因为编译器不知道将返回哪种类型,因此它无法绑定到 runtime 类型的属性。
根据如何获取运行时对象的数据,有一些选择:
dynamic
-使用dynamic
将所有特权绑定推迟到运行时(基本上与上面相同,但是让编译器生成必要的反射代码)答案 1 :(得分:0)
这似乎是AutoMapper的一个好用例。
首先初始化类之间的映射。
Mapper.Initialize(cfg => {
cfg.CreateMap<DataInput, Class1>();
cfg.CreateMap<DataInput, Class2>();
// etc.
});
注意:您可能需要创建一些自定义映射like projections,因为看起来您的字段类型并不总是匹配。
然后,您可以利用Mapper.Map方法:
public object Convert(DataInput ratCommon, Type type1) => Mapper.Map(foo, typeof(DataInput), type1);
或者,如果type1
在编译时是已知的,则可以通过泛型获得类型安全性:
public T Convert<T>(DataInput ratCommon) => Mapper.Map<T>(foo);