.net - 如何通过只知道类型来实例化类的属性
问题描述
我有一个包含其他几个类作为属性的类。最初,没有实例化任何属性。我想通过在 Load 函数中传递属性本身来实例化单个属性。
public class MyMainClass
{
public ClassA A { get; set; }
public ClassB B { get; set; }
public ClassC C { get; set; }
// ...
// ...
// Many more. All these classes are inherited from Class0
public void Load(Class0 UnknownClass)
{
if ((UnknownClass) is ClassA) A = new ClassA();
if ((UnknownClass) is ClassB) B = new ClassB();
if ((UnknownClass) is ClassC) C = new ClassC();
// and so on... This should to be done in a loop
}
}
public void Main()
{
MyMainClass MyObj = new MyMainClass();
MyObj.Load(MyObj.ClassA); // This should instantiate MyObj.ClassA
MyObj.ClassA.SomeMethod();
}
Class0
是 的基类ClassA
,ClassB
依此类推。
这工作正常。但我不想为每个班级写一大堆比较。我需要遍历属性,找到匹配的类型并实例化它。我可能需要使用 system.reflection,但不确定如何...
还有其他类似的答案,但每个都根据传递的类型实例化一个新对象。我需要实例化类的属性。
解决方案
好的,在结合其他几个答案后,我终于想通了:
public void Load<T>() where T : new()
{
object lObj = Activator.CreateInstance(typeof(T)); // instantiate a new object of type passed
// Loop through properties and assign object to the property that matches its type
System.Reflection.PropertyInfo[] lProps = typeof(MyMainClass).GetProperties();
foreach (System.Reflection.PropertyInfo lProp in lProps)
{
if ((typeof(T).ToString() == lProp.PropertyType.Name)) lProp.SetValue(this, lObj);
}
}
推荐阅读
- windows - 如何使用 7zip 使用批处理文件单独压缩文件夹中的所有文件?
- python - 如何在seaborn countplot中对两个不同变量的值求和
- https - Arduino 如何使用 ArduinoHttpClient 向 HTTPS 发送请求
- node.js - req.isAuthenticated() 总是在护照本地策略之外返回 false
- amazon-web-services - 一个域,两个不同的 Vue 站点,由 Cloudfront / S3 提供服务
- typescript - 使用角度 ng-update 示意图迁移重大更改
- java - 找不到JAVA的路径?
- delphi - 右键单击不会更新 TControlList 中的 ItemIndex
- php - Laravel 重定向返回问题
- c++ - 当基类没有虚拟析构函数时,将模拟作为 unique_ptr 传递