[英]C# calling a public non-static method using reflection without instantiating its class
[英]Instantiating class using reflection and calling a method
下面是我从类对象获取属性值的方法。 我如何通过将类名作为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);
谢谢
我不是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();
}
这将使用要加载的类的类型和一些xml数据调用LoadFromXmlData。
为了避免反射调用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();
}
如果是实例方法,则可以
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()});
我相信您将需要执行以下操作:
Type.GetType("Namespace.Class1").GetConstructor(new Type[] {}).Invoke(null);
“ Namespace.Class1”是程序集限定的。 例如,一个类的程序集限定名称可能看起来像这样:
TopNamespace.SubNameSpace.ContainingClass + NestedClass,MyAssembly,版本= 1.3.0.0,文化=中性,PublicKeyToken = b17a5c561934e089
我认为您需要使用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");
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.