【发布时间】:2015-04-14 12:55:16
【问题描述】:
我有一个客户端应用程序,它使用外部 dll 中的类(和枚举),该 dll 在运行时加载并反映。我知道我期望在 dll 中找到哪些方法以及我期望调用它的枚举。
我想创建一个可以在客户端应用程序中使用的委托,它是在运行时从反射方法创建的。这种方法在委托只有“标准”类型时有效,但是如果 dll 方法采用枚举,我怎样才能让它工作呢?我不能将委托中的枚举声明为object,因为它是一种值类型,尝试Enum 或int 似乎也不起作用。有没有解决的办法?感谢您的帮助!
// e.g. external code
namespace test2
{
public static class test2
{
public static int calc(int a, int b, testEnum c)
{
if (c == testEnum.add) return a + b;
else return a - b;
}
public static int add(int a, int b)
{
return a + b;
}
}
public enum testEnum
{
add, subtract
}
}
// my client code
namespace test1
{
public class TestClient
{
private static Assembly _assembly;
public static void SetUp()
{
const string externalDll = ".../test2.dll";
Assembly assembly = Assembly.LoadFrom(externalDll);
AppDomain.CurrentDomain.Load(assembly.GetName());
_assembly = assembly;
}
private delegate int _add(int a, int b);
private _add add;
private delegate int _calc(int a, int b, ??? c); // nothing works here
private _calc calc;
public void Run()
{
SetUp();
add = GetExpectedFunction<_add>("add");
int three = add(1, 2); // OK
calc = GetExpectedFunction<_calc>("calc"); // not OK
// intended usage
var reflectedEnum = ReflectMe("testEnum", "add");
int threeAgain = calc(1, 2, reflectedEnum);
}
public static T GetExpectedFunction<T>(string functionName) where T : class
{
try
{
if (!typeof(T).IsSubclassOf(typeof(Delegate))) throw new ApplicationException("GetExpectedFunction must return a delegate!");
var foundMethod = _assembly.GetType("test2.test2").GetMethod(functionName, BindingFlags.Public | BindingFlags.Static);
return (T)(object)Delegate.CreateDelegate(typeof(T), foundMethod);
}
catch (Exception e)
{
// "Error binding to target method!"
}
}
}
}
【问题讨论】:
-
能否也显示
ReflectMe方法的来源?您尝试做的事情非常棘手,但这并非不可能。 -
对不起,我还没有写那一点 :) 我只是把它放进去以显示我想要做什么。问题是我无法让代表打电话给
GetExpectedFunction<_calc>("calc"); -
试试
Func<int,int,int,int>
标签: c# reflection enums delegates