【发布时间】:2015-08-27 15:54:28
【问题描述】:
我有以下课程:
internal class MyQueryTranslator : ExpressionVisitor, IExpressionTranslator<QueryRequest>
{
private IReflectionManager _reflectionManager;
internal MyQueryTranslator(IReflectionManager reflectionManager)
{
this._reflectionManager = reflectionManager;
}
//....
}
同时,在另一个类中,我正在尝试使用Activator.CreateInstance() 方法实例化这个类:
internal class MyPersistenceStrategy<E> : IAsyncPersistenceStrategy<E>
where E : class, IPersistableEntity
{
private IReflectionManager _reflectionManager;
private static readonly Dictionary<Type, Type> _translators;
static MyPersistenceStrategy()
{
_translators = new Dictionary<Type, Type>()
{
{ typeof(QueryRequest), typeof(MyQueryTranslator) }
}
}
private T TranslateExpression<T>(Expression expression)
{
if(_translators.ContainsKey(typeof(T))
throw new InvalidOperationException(String.Format("There is no translator for: {0}", typeof(T).Name);
IExpressionTranslator<T> translator =
(IExpressionTranslator<T>)Activator.CreateInstance(_translators[typeof(T)],
BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance,
null,
_reflectionManager,
null);
return translator.Translate(expression);
}
//...
}
但是,我收到以下错误:
在 mscorlib.dll 中出现
System.MissingMethodException类型的未处理异常
附加信息:未找到类型XXXXX.MyQueryTranslator的构造函数
如您所见,我传递了适当的BindingFlgs,因此可以实际找到构造函数。
TranslateExpression<T> 方法是这样调用的:
QueryRequest request = TranslateExpression<QueryRequest>(expression);
我还应该注意,这两个类都在同一个程序集中。
【问题讨论】:
-
您提供的代码使用了
CreateInstance的重载,这......不存在。你的意思是new[] { _reflectionManager }作为第四个参数吗? -
@LucasTrzesniewski 我不敢相信就是这样!!重载确实存在,因为它编译正确。请张贴作为答案,所以我可以关闭这个问题
-
很奇怪。显然它匹配了一些过载。在这种情况下它在做什么?
-
啊,我敢打赌它匹配 CreateInstance(Type, params object[]) 重载。
标签: c# .net exception reflection system.reflection