【问题标题】:How to do Activator.CreateInstance for various constructors?如何为各种构造函数做 Activator.CreateInstance?
【发布时间】:2010-12-02 15:29:23
【问题描述】:

我需要获取我的 DataContext 子类,我发现下面的函数位于某处,它确实找到了我的子类,但我无法实例化它:(

  public static IEnumerable<T> GetSubclassesFor<T>(Assembly assembly)
  {
   return (assembly.GetTypes()
    .Where(t => t.BaseType == (typeof (T)))
    .Select(t => (T) Activator.CreateInstance(t, new object[] {"asdasd"})))
    .ToList();
  }

我收到以下错误消息:

System.Reflection.TargetInvocationException : Ett undantagsfel har inträffat i målet för en aktivering。 ----> System.TypeInitializationException : 典型代表 PlaynGO.Cashier.Data.CashierDC utlöste ett undantag。 ----> System.NullReferenceException : Objektreferensen har inte angetts until en instans av ett objekt。视频 System.RuntimeMethodHandle.InvokeConstructor(IRuntimeMethodInfo 方法,对象 [] 参数,参考 SignatureStruct 签名,RuntimeType 声明类型)视频 System.Reflection.RuntimeConstructorInfo.Invoke(BindingFlags invokeAttr, Binder 绑定器, Object[] 参数, CultureInfo 文化) vid System.RuntimeType.CreateInstanceImpl(BindingFlags bindingAttr,活页夹活页夹,对象[] 参数,CultureInfo 文化,对象 [] 激活属性) vid System.Activator.CreateInstance(类型 类型,对象 [] 参数) vid PlaynGO.Dbml.Reflexion.b_3(类型 t) i Reflexion.cs:第 23 行视频 System.Linq.Enumerable.WhereSelectArrayIterator2.MoveNext() vid System.Collections.Generic.List1..ctor(IEnumerable1 collection) vid System.Linq.Enumerable.ToList(IEnumerable1 来源)视频 PlaynGO.Dbml.Reflexion.GetInstances(程序集 程序集)我 Reflexion.cs:第 23 行视频 PlaynGO.Dbml.UnitTests.TestReflection.TestGettingTypes() i TestReflection.cs:第 21 行 --TypeInitializationException vid PlaynGO.Cashier.Data.CashierDC..ctor(String 联系) --NullReferenceException vid PlaynGO.Cashier.Data.CashierDC..cctor()

我要调用的构造函数如下:

    public CashierDC(string connection) :
   base(connection, mappingSource)

MappingSource 是直接实例化的,是一个实例字段。我哪里错了?我该怎么做才能完成这项工作?

PS。这是 .NET 4.0

【问题讨论】:

  • 请尝试翻译错误信息。
  • LOL.. 他说“做”... :)
  • cctor 不是静态构造函数吗?有吗?如果有,可以发一下吗?

标签: c#


【解决方案1】:

我认为你的错误是另一回事。如果 Activator.CreateInstance 找不到您的构造函数,您将得到 MissingMethodException 而不是 TargetInvocationException。我怀疑您要实例化的实际类中还有其他问题。

【讨论】:

  • 我同意,您的构造函数中似乎出现了 NullReferenceException。如果要仔细检查,请运行调试器并在构造函数上设置断点以查看它是否被调用。
  • 感谢您回答问题。这是另外一回事,我现在讨厌自己。
【解决方案2】:

TargetInvocationException 指示它正在调用的构造函数已引发异常。这可能是由于您为连接字符串传递的实际值。您可能想尝试使用调试器并在构造函数中设置一个断点,并采用连接字符串并 (1) 确保它正在被调用并 (2) 确定异常发生的位置。

【讨论】:

  • 感谢您抽出宝贵时间。你是对的,这是 ServiceLocator 的问题 :( 我希望我从未走上那条黑暗的道路。
猜你喜欢
  • 2015-08-27
  • 1970-01-01
  • 1970-01-01
  • 2010-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-14
  • 2016-04-06
相关资源
最近更新 更多