【问题标题】:Constructor on type '###' not found找不到类型“###”的构造函数
【发布时间】:2012-09-28 11:46:43
【问题描述】:

我有一个接受这些参数的类型:

public SmaSeries(ISeries<decimal> parent, int periods, TierKind? runOnTier = null) 

我正在尝试通过在 args 参数中传递 object[] 来使用 Activator.CreateInstance(接受类型和 args 的重载)创建这种类型的实例:

 new object[] 
 {
    new DecimalSeries(),
    20,
    new Nullable<TierKind>(TierKind.Client)
 }

//DecimalSeries implements ISeries<decimal>

返回未找到类型“SmaSeries”的构造函数。

有没有办法修复 args 以便激活器找到构造函数?

谢谢。

【问题讨论】:

  • DecimalSeries 的实现是什么?
  • 请展示一个简短但完整的程序来说明问题。
  • new Nullable&lt;TierKind&gt;(TierKind.Client)
  • 这对我来说运行良好。如果有什么我怀疑你的DecimalSeries,我看不出还有什么问题。

标签: c# .net reflection


【解决方案1】:

在 .NET 4.5 甚至 2.0 中都能正常工作

using System;

class SmaSeries
{
    public SmaSeries(ISeries<decimal> parent, int periods,
         TierKind? runOnTier = null) { }
    static void Main()
    {
        object[] args = new object[] 
         {
            new DecimalSeries(),
            20,
            new Nullable<TierKind>(TierKind.Client)
         };

        object obj = Activator.CreateInstance(typeof(SmaSeries), args);
    }
}
enum TierKind { Client }
interface ISeries<T> { }
class DecimalSeries : ISeries<decimal> { }

我想也许:您的构造函数或其中一种类型可能不是公开的吗?

【讨论】:

  • 我认为 2.0 不允许在参数上指定默认值。
  • @AlexMendez 实际上,确实如此...我说的是 .NET 平台 2.0,而不是 C# 编译器。使用的属性一直存在,由 VB.NET 提供;如果您使用较新的编译器版本来针对较早的 .NET 版本,则可以正常工作。 Activator.CreateInstance 的工作方式完全取决于 .NET 版本(而不是 C# 版本)。您所说的(可选参数)很大程度上是编译器功能,而不是运行时功能(尽管它有点比这更复杂......不是一切)
  • 我知道VB,但不知道你可以用后来的编译器编译到2.0,并且仍然在c#的参数中使用默认值。另外,我认为我没有说任何关于可选参数的内容。这是参数的默认值。很高兴知道。谢谢。
  • @AlexMendez 可选参数,和带默认值的参数,基本上是同义词
【解决方案2】:

果然是个bug。我正在创建对象列表以动态添加参数,然后在调用激活器时忘记执行 ToArray,并且由于 args 是参数对象 [],因此它采用列表而不是其成员。很抱歉浪费您的时间,并感谢所有回复/评论此帖子的人。

【讨论】:

  • 伙计,你让我免于调试几个小时。
【解决方案3】:

在将 Unity 项目导出到 iOS 后,我收到了关于 DateTimeConverter 的错误。原来项目中的一个 DLL 使用反射来获取类型转换器,因此执行时的代码需要一个 DateTimeConverter,而在原始代码库中没有明确引用它。我怀疑这导致程序集在代码剥离过程中被排除在最终构建之外。

解决方案就是添加一个:

new System.ComponentModel.DateTimeConverter();

源代码中的任何位置。这表明构建过程包含必要的代码。

【讨论】:

    猜你喜欢
    • 2010-12-12
    • 2013-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-24
    • 1970-01-01
    相关资源
    最近更新 更多