3

DataTable から継承する次のクラスがあります。

public class ExcelStaticDataTable : DataTable
{
    public List<ExcelStaticDataTable> SubTables { get; set; }
    public ExcelStaticDataTable(string tableName): base(tableName)
    {
        SubTables = new List<ExcelStaticDataTable>();
    }
}

MissingMethodException次の操作を行うと、「このオブジェクトに対して定義されたパラメーターなしのコンストラクター」を取得する理由を知っていますか:

ExcelStaticDataTable table=new ExcelStaticDataTable("table1");
table.Clone();

明確にするために、両方のコードが異なる dll にあります。そしてここにスタックトレース:

at System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolean noCheck, Boolean& canBeCached, RuntimeMethodHandleInternal& ctor, Boolean& bNeedSecurityCheck)
   at System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache, StackCrawlMark& stackMark)
   at System.RuntimeType.CreateInstanceDefaultCtor(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache, StackCrawlMark& stackMark)
   at System.Activator.CreateInstance(Type type, Boolean nonPublic)
   at System.Data.DataTable.CreateInstance()
   at System.Data.DataTable.Clone(DataSet cloneDS)
   at System.Data.DataTable.Clone()
   at System.Data.DataTable.Copy()
   at ..........cs:line 35

ありがとう。

4

1 に答える 1

6

object newObj = Activator.CreateInstance(GetType());他のコードがの一部として使用していると思われClone()ます。これには、デフォルトの使用法でパラメーターなしのパブリック コンストラクターが必要です。それ以外の場合は、 をスローしMissingMethodExceptionます。

更新: スタック トレースを示す更新により、これが確認されます。

メソッドをオーバーライドすることでこれを修正できると思いますCreateInstance

protected override DataTable CreateInstance()
{
    return new ExcelStaticDataTable(TableName);
}
于 2013-01-15T14:37:40.810 に答える