使用反射实例化类并调用方法

时间:2011-03-25 16:41:55

标签: c# asp.net reflection

以下是从类对象获取属性值的方法。如何通过将类名称作为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);

由于

4 个答案:

答案 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");
    }
}