pro*_*eek 2 .net c# reflection instantiation invoke
我有这个库编译为calc.dll.
namespace MyClass
{
public class Calculator
{
public int Value1 {get; set;}
public int Value2 {get; set;}
public Calculator()
{
Value1 = 100;
Value2 = 200;
}
public int Add(int val1, int val2)
{
Value1 = val1; Value2 = val2;
return Value1 + Value2;
}
}
}
Run Code Online (Sandbox Code Playgroud)
我想实例化Calculate类而不链接到calc.dll.C#可以做到吗?我想出了这个代码,但我不知道如何实例化这个Calculator类.
using System;
using System.IO;
using System.Reflection;
using System.Diagnostics;
using System.Collections.Generic;
namespace EX
{
public class Code
{
public static void Test()
{
string path = Directory.GetCurrentDirectory();
string target = Path.Combine(path, @"./myclass.dll");
Assembly asm = Assembly.LoadFrom(target);
Calculator h = new Calculator(); // <-- ???
Type type = h.GetType();
MethodInfo m = type.GetMethod("Add");
int res = (int) m.Invoke(h, param);
Console.WriteLine("{0}", res);
}
public static void Main()
{
Test();
}
}
}
Run Code Online (Sandbox Code Playgroud)
我有两个解决方案,一个来自Bala R.
var param = new object[] {100, 200};
string path = Directory.GetCurrentDirectory();
string target = Path.Combine(path, @"./myclass.dll");
Assembly asm = Assembly.LoadFrom(target);
Type calc = asm.GetType("MyClass.Calculator");
object h = Activator.CreateInstance(calc);
MethodInfo m = calc.GetMethod("Add");
int res = (int) m.Invoke(h, param);
Console.WriteLine("{0}", res);
Run Code Online (Sandbox Code Playgroud)
这个是来自agent-j
string path = Directory.GetCurrentDirectory();
string target = Path.Combine(path, @"./myclass.dll");
Assembly asm = Assembly.LoadFrom(target);
Type type = asm.GetType("MyClass.Calculator");
ConstructorInfo ctor = type.GetConstructor(Type.EmptyTypes);
object calc = ctor.Invoke(null);
MethodInfo m = type.GetMethod("Add");
var param = new object[] {100, 200};
int res = (int) m.Invoke(calc, param);
Console.WriteLine("{0}", res);
Run Code Online (Sandbox Code Playgroud)
他们两个都在工作,但我更喜欢Bala的解决方案,因为它更短,并且object h通过CreateInstance比获得构造函数更直观object h(calc).
string path = Directory.GetCurrentDirectory();
string target = Path.Combine(path, @"./myclass.dll");
Assembly asm = Assembly.LoadFrom(target);
Type type = asm.GetType("MyClass.Calculator");
ConstructorInfo ctor = type.GetConstructor(Type.EmptyTypes);
object calc = ctor.Invoke (null);
MethodInfo m = type.GetMethod("Add");
int res = (int) m.Invoke(calc, param);
Console.WriteLine("{0}", res);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
10447 次 |
| 最近记录: |