我从一些配置设置中获得的是我的类的名称作为字符串。 我的所有课程都遵循一个界面。但有些人遵循次要的不同界面
所以例如我的树'类都将遵循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语句来检查不同的设置界面。
答案 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);
}
关于此的几点说明:
您可能需要将从XML文件读取的数据类型强制转换为与属性对应的类型,但PropertyType
对象上的PropertyInfo
属性(由{{返回) 1}}),包含有助于此的信息。
您还可以使用GetProperty
上的GetMethod
方法查找和执行方法(即您可以使用方法从XML文件中设置值)。