找不到类型'###'的构造函数

时间:2012-09-28 11:46:44

标签: c# .net reflection

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

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以便激活器找到构造函数?

感谢。

3 个答案:

答案 0 :(得分:6)

在.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> { }

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

答案 1 :(得分:3)

果然这是一个错误。我正在创建对象列表以便动态添加参数,然后在调用激活器时忘记执行ToArray,并且因为args是params object [],所以它采用了列表而不是取其成员。很抱歉浪费你的时间,感谢所有回复/评论过这篇文章的人。

答案 2 :(得分:0)

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

解决方案只是添加一个:

new System.ComponentModel.DateTimeConverter();

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