以下是从类对象获取属性值的方法。如何通过将类名称作为String实例化来实现相同的目的。实例化后,我想使用同一页面上提供的方法'LoadFromXmlData()'。可以这样做吗?
private string GetPropertyValue(string propName, string className)
{
Class1 _Class1;
Class2 _Class2;
Class3 _Class3;
if (className.Equals("Class1"))
{
_Class1 = new Class1();
_Class1 = (Class1)Class1.LoadFromXmlData(typeof(Class1), myData.ToString());
return _Class1.GetType().GetProperty(propName).GetValue(_Class1, null).ToString();
}
else if (ActionClassName.Equals("TicketActionDef"))
{
_Class2 = new Class2();
_Class2 = (Class2)Class2.LoadFromXmlData(typeof(Class2), myData.ToString());
return __Class2.GetType().GetProperty(propName).GetValue(_Class2, null).ToString();
}
else
{
_Class3 = new Class3();
_Class3 = (Class1)Class1.LoadFromXmlData(typeof(Class3), myData.ToString());
return __Class3.GetType().GetProperty(propName).GetValue(_Class3, null).ToString();
}
}
我将加载我的DLL,如下所示。我应该怎么办呢。请帮助,我很反思。
Assembly assembly = Assembly.GetAssembly(typeof(MyAdapter));
MyAdapter currentEventObject = (MyAdapter)assembly.CreateInstance(className);
由于
答案 0 :(得分:4)
我不是100%确定我理解你想要实现的全部范围,而是为了实例化一个命名类(确保包含完全限定名称; fullNamespace.className)并调用方法你可以这样做:
private static string GetPropertyValue(Assembly assembly, string className,
string propertyName)
{
object instance = assembly.CreateInstance(className);
Type classType = instance.GetType();
MethodInfo method = classType.GetMethod("LoadFromXmlData");
method.Invoke(instance, new object[] { classType, myData });
PropertyInfo property = classType.GetProperty(propertyName);
return property.GetValue(instance, null).ToString();
}
这将调用LoadFromXmlData,其中包含要加载的类的类型和一些xml数据。
为了避免调用LoadFromXmlData方法的反射,您应该创建一个所有动态加载类型必须实现的接口:
interface IXmlLoadable
{
void LoadFromXmlData(Type type, string data);
}
然后方法调用可以简化为:
((IXmlLoadable)instance).LoadFromXmlData(classType, myData));
如果您使用的是C#4,则可以使用dynamic关键字来简化反射工作:
private static string GetPropertyValue(Assembly assembly, string className,
string propertyName)
{
dynamic instance = assembly.CreateInstance(className);
Type classType = instance.GetType();
instance.LoadFromXmlData(classType, "<xml></xml>");
PropertyInfo property = classType.GetProperty(propertyName);
return property.GetValue(instance, null).ToString();
}
答案 1 :(得分:2)
如果是实例方法,你可以
Object _Class1 = Type.GetType("Class1").GetConstructor(new Type[0]).Invoke(null);
Type.GetType("Class1").GetMethod("LoadFromXmlData" typeof (Class1).GetMethod("LoadFromXmlData").Invoke(_Class1, new[]{myData.ToString()});
答案 2 :(得分:0)
我相信你需要做这样的事情:
Type.GetType("Namespace.Class1").GetConstructor(new Type[] {}).Invoke(null);
“Namespace.Class1”是程序集限定的。例如,类的程序集限定名称可能如下所示:
TopNamespace.SubNameSpace.ContainingClass + NestedClass, MyAssembly,版本= 1.3.0.0, 文化=中性, 公钥= b17a5c561934e089
答案 3 :(得分:0)
我认为您需要使用Activator.CreateInstance()方法创建类的实例。您可以直接在对象中调用该方法。
class Program
{
static void Main(string[] args)
{
Assembly asm = Assembly.GetExecutingAssembly();
Sample s1 = Activator.CreateInstance(typeof(Sample)) as Sample;
s1.SayHello();
}
}
public class Sample
{
public void SayHello()
{
Console.WriteLine("Hello World");
}
}