2009-07-08 13 views
9

私は現在、整数パラメータを取るいくつかのメソッドを持つクラスを持っています。これらの整数は、アプリケーションが実行できる操作にマップされます。クラスのコンシューマが、その中のすべての操作で持つ列挙型を提供できるように、クラスを汎用的にしたいです。次に、その列挙型のパラメータがメソッドに渡されます。しかし、私はジェネリック型を全く指定することができないようにし、現行の方法から構文が変更されていない整数に戻すようにします。これは可能ですか?ジェネリックのためにどのようにデフォルトタイプを提供しますか?

+0

はVilx-ソリューション@良いアプローチとより良い答えではありませんか? –

答えて

4
あなたは、クラスの定義の中でそれを行うことはできません

var foo = new MyGenericClass(); // defaults to integer... this doesn't work 
var bar = new MyGenericClass<MyEnum>(); // T is a MyEnum 

本当にデフォルトの型ビーイングint型のimplicitnessを重視する場合は、静的な工場でそれを行う必要があるでしょう方法は、私はそれの価値が表示されません。

public class MyGenericClass<T> 
{ 
    public static MyGenericClass<T> Create() 
    { 
     return new MyGenericClass<T>(); 
    } 
    public static MyGenericClass<int> CreateDefault() 
    { 
     return new MyGenericClass<int>(); 
    } 
} 

実際に上記のような恩恵を受ける方法については、以下を参照してください。

var foo = MyGenericClass<MyEnum>.Create(); 
var bar1 = MyGenericClass.CreateDefault(); // doesn't work 
var bar2 = MyGenericClass<int>.CreateDefault(); // works, but what's the point 

あなたも遠くそれを取るしたい場合は、この問題を解決します静的なファクトリクラスを作成することができますが、デフォルトを提供するよりも、他の理由のためにそれをやっている場合には、さらに多くのばかげソリューションですタイプ:

public static class MyGenericClassFactory 
{ 
    public static MyGenericClass<T> Create<T>() 
    { 
     return new MyGenericClass<T>(); 
    } 
    public static MyGenericClass<int> Create() 
    { 
     return new MyGenericClass<int>(); 
    } 
} 

var foo = MyGenericClassFactory.Create(); // now we have an int definition 
var bar = MyGenericClassFactory.Create<MyEnum>(); 
+0

ええ、私はその複雑さを紹介したくありません。デフォルトはあまり重要ではない、ちょうど良いだろう。私はdidn '私はそれをする方法を知っていますが、私は皆さんが最初に確認することを確認したかったのです。答えをありがとう –

1

コンパイラは、渡された引数の型に基づいて方法ほとんどの時間を上型引数を推論することができます

public void DoSomething<T>(T test) { 
} 

はところで

DoSomething(4);     // = DoSomething<int>(4); 
DoSomething(MyEnum.SomeValue); // = DoSomething<MyEnum>(MyEnum.SomeValue); 

で呼び出すことができ、ジェネリックメソッドのジェネリックでないオーバーロードを持つこともできます。

+0

私は、クラスを「オプションで汎用」にしたいと考えています。私はそれが可能だとは思わないので、ジェネリックでないオーバーロードでジェネリックメソッドを作成する必要があります...私はこの "SecurityContext sec = new SecurityContext();"を探していました。 (これはパラメータ用の整数を使用して作成し、次に "SecurityContext sec = new SecurityContext ();"を使用して作成されます) –

2

元のバージョン(非汎用バージョン)を保存し、汎用バージョンを作成します。

非汎用バージョンから汎用バージョンを呼び出します。

void Main() 
{ 
DoSomething(2); 
DoSomething(EnumValue); 

} 

public void DoSomething(int test) { 
DoSomething<int>(test); 
} 

// Define other methods and classes here 
public void DoSomething<T>(T test) { 
Console.WriteLine(test); 
} 
+0

汎用パラメータ型はすべてのメソッドで同じです私はクラスレベルでそれをしたいと思います。私はジェネリック版を作ってからそれをintバージョン用に継承することができると知っていますが、私はそれをすべて一つにすることを望んでいました...しかし、 –

12

だから...単純な継承を使用してみませんか?同様に:あなたは両方の方法を書くことができます

class MyGenericClass<T> 
{ 
} 

class MyGenericClass : MyGenericClass<int> 
{ 
} 

この方法:

var X = new MyGenericClass<string>(); 
var Y = new MyGenericClass(); // Is now MyGenericClass<int> 
関連する問題