-1

これは合法ではありません:

public class MyBaseClass
{
  public MyBaseClass() {}
  public MyBaseClass(object arg) {}
}


public void ThisIsANoNo<T>() where T : MyBaseClass
{
  T foo = new T("whoops!");
}

これを行うには、Tの型オブジェクトを反映するか、Activator.CreateInstanceを使用する必要があります。どちらもかなり厄介です。もっと良い方法はありますか?

4

4 に答える 4

2

いいえ。パラメーターを渡していない場合は、型パラメーターを制約して、パラメーターなしのコンストラクターを要求することができます。ただし、引数を渡す必要がある場合は、運が悪いです。

于 2008-09-18T20:28:56.320 に答える
1

T が空のコンストラクター以外の特定のコンストラクター シグネチャを持つように制約することはできませんが、T が目的のシグネチャを持つファクトリ メソッドを持つように制約することはできます。

public abstract class MyBaseClass
{
    protected MyBaseClass() {}
    protected abstract MyBaseClass CreateFromObject(object arg);
}

public void ThisWorksButIsntGreat<T>() where T : MyBaseClass, new()
{
    T foo = new T().CreateFromObject("whoopee!") as T;
}

ただし、このシナリオでは、Abstract Factory などの別の作成パターンを使用することをお勧めします。

于 2008-09-18T20:45:13.130 に答える
0
where T : MyBaseClass, new()

パラメーターなしのパブリック コンストラクターでのみ機能します。それを超えて、activator.CreateInstance に戻ります (これはそれほど悪いことではありません)。

于 2008-09-18T20:28:55.493 に答える
-2

機能していないことがわかります。

しかし、あなたがこれを行うのを妨げているものは何ですか?

public void ThisIsANoNo<T>() where T : MyBaseClass
{
  MyBaseClass foo = new MyBaseClass("whoops!");
}

すべてが MyBaseClass から継承されるため、それらはすべて MyBaseClass になりますよね?

私はそれを試してみましたが、これはうまくいきます。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            ThisIsANoNo<MyClass>();
            ThisIsANoNo<MyBaseClass>();
        }

        public class MyBaseClass
        {
            public MyBaseClass() { }
            public MyBaseClass(object arg) { }
        }

        public class MyClass :MyBaseClass
        {
            public MyClass() { }
            public MyClass(object arg, Object arg2) { }
        }

        public static void ThisIsANoNo<T>() where T : MyBaseClass
        {
            MyBaseClass foo = new MyBaseClass("whoops!");
        }
    }
}
于 2008-09-18T20:31:37.407 に答える