如何使用反射从静态方法调用实例类方法
本文关键字:调用 实例 类方法 静态方法 何使用 反射 | 更新日期: 2023-09-27 17:51:07
namespace ClassLibraryB {
public class Class1 {
public void Add(int ii, int jj)
{
i = ii;
j = jj;
result = i + j;
}
public void Add2()
{
result = i + j;
}
}
}
它被静态调用并给出一个答案
ClassLibraryB.Class1 objB = new ClassLibraryB.Class1();
objB.Add(4, 16);
objB.Add2();
kk = objB.result;
textBox1.Text += "Addition =" + kk.ToString() + "'r'n";
然而,当我尝试使用下面调用dll时,它失败了,因为它不是静态的
Assembly testAssembly = Assembly.LoadFile(strDLL);
Type calcType = testAssembly.GetType("ClassLibraryB.Class1");
object calcInstance = Activator.CreateInstance(calcType);
PropertyInfo numberPropertyInfo = calcType.GetProperty("i");
numberPropertyInfo.SetValue(calcInstance, 5, null);
PropertyInfo numberPropertyInfo2 = calcType.GetProperty("j");
numberPropertyInfo2.SetValue(calcInstance, 15, null);
int value2 = (int)numberPropertyInfo.GetValue(calcInstance, null);
int value3 = (int)numberPropertyInfo2.GetValue(calcInstance, null);
calcType.InvokeMember("Add2",BindingFlags.InvokeMethod | BindingFlags.Instance | BindingFlags.Public,
null, null, null);
PropertyInfo numberPropertyInfo3 = calcType.GetProperty("result");
int value4 = (int)numberPropertyInfo3.GetValue(calcInstance, null);
我只需要确切地知道我必须对dll类做什么更改才能在这里调用
必须将该类型的实例传递给InvokeMember
calcType.InvokeMember("Add2", flags, null, calcInstance, null);
如果您正在创建一个插件,正确的做法是有三个程序集。
- 包含插件的接口声明的类库(dll)
- 包含接口(插件)实现的类库(dll) 加载插件的可执行文件(exe)
接口DLL由其他两个组件引用。您需要三个程序集,因为插件不应该知道任何关于您的应用程序的信息,而应用程序也不应该知道除了它的接口之外的任何关于插件的信息。这使得插件可以互换,不同的应用程序可以使用相同的插件。
接口组件Calculator.Contracts.dll
public interface ICalculator
{
int Add(int a, int b);
}
插件实现Calculator.dll
public class Calculator : ICalculator
{
public int Add(int a, int b)
{
return a + b;
}
}
现在您可以加载插件并在应用程序(exe)中以键入的方式使用它:
Assembly asm = Assembly.LoadFrom(strDLL);
string calcInterfaceName = typeof(ICalculator).FullName;
foreach (Type type in asm.GetExportedTypes()) {
Type interfaceType = type.GetInterface(calcInterfaceName);
if (interfaceType != null &&
(type.Attributes & TypeAttributes.Abstract) != TypeAttributes.Abstract) {
ICalculator calculator = (ICalculator)Activator.CreateInstance(type);
int result = calculator.Add(2, 7);
}
}