如何创建一个我只有字符串名称的类型的对象?

时间:2014-11-29 00:51:40

标签: c# .net

我从一些配置设置中获得的是我的类的名称作为字符串。 我的所有课程都遵循一个界面。但有些人遵循次要的不同界面

所以例如我的树'类都将遵循IRoots接口,但有些可能会有不同的设置。

coniferousTree : IRoots, IGreenLeafSettings
deciduousTree : IRoots, IGreenLeafSettings
specialtree1 : IRoots, INeonLeafSettings
specialTree2 : IRoots, INeonLeafSettings

因此,当我在XML文件中遇到树的名称时,我想实例化该树的确切对象类型并将设置应用于树(因为它们在配置文件中定义)

我坚持的是这个 说我在XML中的这个节点

<Tree Tree="coniferousTree" Gsetting1="" Gsetting2="" Gsetting3="" />

(这三个设置将是树对象中实现的设置界面的属性)

//first I read the attribute value from XML that indicated the tree object
string treeName = tree.Attribute("Tree").Value;  

//then try and instantiate the object
 Assembly a = Assembly.LoadFile(assemblyPath + @"\Tree.dll");
 var type = a.GetTypes().First(x => x.Name == treeName);
 var myObject = (IRoots)Activator.CreateInstance(type);

但我真正想要回归的是实际的对象类型而不是接口类型。 (因为我想将设置应用于它)

如果我在那个特定节点上,我想要这个

var myObject = (**coniferousTree**)Activator.CreateInstance(type);

但我不能,因为我在编码时不会提前知道这就是我需要将其投射的类型。

有没有一种很好的方法可以解决这个问题,而不需要使用一堆if else语句来检查不同的设置界面。

1 个答案:

答案 0 :(得分:1)

如果您需要做的就是将设置从XML文件移动到实例化对象中,那么我认为您要找的是Reflection

var myObject = Activator.CreateInstance(type);

// Substitute code here to retrieve the property name/value pairs from the XML file 
var myProperty = "GSetting1";
var myValue = "ABC";

// See if the requested property actually exists in the class
var oProperty = type.GetProperty(myProperty, System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.IgnoreCase | System.Reflection.BindingFlags.Public);
if (oProperty != null)
{
    // If it does, set its value based on what was retrieved from the XML file
    oProperty.SetValue(myObject, myValue, null);
}

关于此的几点说明:

  1. 您可能需要将从XML文件读取的数据类型强制转换为与属性对应的类型,但PropertyType对象上的PropertyInfo属性(由{{返回) 1}}),包含有助于此的信息。

  2. 您还可以使用GetProperty上的GetMethod方法查找和执行方法(即您可以使用方法从XML文件中设置值)。

    < / LI>