Return 从只接受 class 类型的方法中动态生成的对象
Return an object dynamically from a method that accepts only type of class
我正在研究 .NET Framework 3.5
我需要在 C# 中创建一个方法,它可以接受 5 种类型的 classes 中的一种,并使用我传递给该方法的 class 类型动态生成对象。所以基本上这个方法有 2 个输入。一种是class的类型,另一种是我需要填充对象的数据对象。
调用该方法后,它应该会自动创建一个我发送的 class 类型的对象,并用我发送的数据对象填充字段。
我尝试使用 System.reflection 的 createinstance,并得到了一个具有所需 class 的对象,但是,我对必须使用我拥有的数据对象填充字段的点感到震惊。非常感谢任何帮助。
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....
I am struck at a point where I have to populate the fields with the data object that I have.
那是因为编译器不知道返回的是什么类型,所以它无法绑定到 runtime 类型的属性。
根据获取运行时对象数据的方式,您有一些选择:
- Reflection - 使用您要使用 reflectrion 设置的名称查找属性
dynamic
- 使用dynamic
将所有属性绑定推迟到运行时(与上面基本相同,但让编译器生成必要的反射代码)
- 反序列化 - 使用现有库从 XML、JSON 等
反序列化
这看起来是 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);
我正在研究 .NET Framework 3.5 我需要在 C# 中创建一个方法,它可以接受 5 种类型的 classes 中的一种,并使用我传递给该方法的 class 类型动态生成对象。所以基本上这个方法有 2 个输入。一种是class的类型,另一种是我需要填充对象的数据对象。 调用该方法后,它应该会自动创建一个我发送的 class 类型的对象,并用我发送的数据对象填充字段。 我尝试使用 System.reflection 的 createinstance,并得到了一个具有所需 class 的对象,但是,我对必须使用我拥有的数据对象填充字段的点感到震惊。非常感谢任何帮助。
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....
I am struck at a point where I have to populate the fields with the data object that I have.
那是因为编译器不知道返回的是什么类型,所以它无法绑定到 runtime 类型的属性。
根据获取运行时对象数据的方式,您有一些选择:
- Reflection - 使用您要使用 reflectrion 设置的名称查找属性
dynamic
- 使用dynamic
将所有属性绑定推迟到运行时(与上面基本相同,但让编译器生成必要的反射代码)- 反序列化 - 使用现有库从 XML、JSON 等 反序列化
这看起来是 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);