2010-12-08 16 views
1

私は、次のしている:ジェネリックコンストラクタおそらく非常に愚かな質問

GenericClass<T> : Class 
{ 
    T Results {get; protected set;} 
    public GenericClass<T> (T results, Int32 id) : base (id) 
    { 
    Results=results; 
    } 
    public static GenericClass<T> Something (Int32 id) 
    { 
    return new GenericClass<T> (i need to pass something like new T?, id); 
    } 
} 

アップデートTはので、新しい(を使用して、タイプまたは値のいずれかになります)値のためのいくつかの種類が、definetelyないためokishです。私はそれがあるクラスの再設計を暗示すると思います。

アイデアはコンストラクタを使用する方法でしたか?例えば、新しいTに似たようなものを渡すことは可能ですか(Tは当時知られていないはずですが)、あるいはnullを渡すのを避けるためにはどうしたらいいでしょうか?

+0

まったく馬鹿ではありません。あなたはここに投稿された質問の** ** **を参照してください;;-) – smirkingman

答えて

1
class GenericClass<T> : Class where T : new() 
{ 
    public T Results {get; protected set;} 
    public GenericClass (T results, Int32 id) : base (id) 
    { 
    Results=results; 
    } 
    public static GenericClass<T> Something (Int32 id) 
    { 
    return new GenericClass<T> (new T(), id); 
    } 
} 
3

これは動作するはずです:

GenericClass<T> : Class where T : new() 
{ 
    T Results {get; protected set;} 
    public GenericClass<T> (T results, Int32 id) 
    { 
    Results=results; 
    } 
    public GenericClass<T> Something (Int32 id) : this(new T(), id) 
    { } 
} 
+0

まさに私が言うつもりだった、あなたは私にそれを打つ。 OPには、基本的に、Tを既知のパブリックコンストラクタ(ここではデフォルトのコンストラクタ)を持つクラスに制限する必要があります。 – KeithS

0

どのようにリフレクションを使用してはどうですか?

public static GenericClass<T> Something (Int32 id) 
    { 
    return new GenericClass<T> ((T)Activator.CreateInstance(typeof(T)), id); 
    } 
+0

これは最上位ですが、これはコンパイルされますが、Tがパブリックなパラメータのないコンストラクタを持っていなければ、実行時には失敗します。 – KeithS