に基づいて、条件付きの方法私は、既存のC#ジェネリッククラスを持っており、使用されるタイプに基づいてメソッドを追加または削除したい、私は特定のMyType<void>
についてはジェネリッククラス:タイプ
public class MyType<T>
{
public T getValue() { return value; }
}
を説明し、私は "したいです「getValue」メソッドを「削除」します。 このようなことはありますか?
に基づいて、条件付きの方法私は、既存のC#ジェネリッククラスを持っており、使用されるタイプに基づいてメソッドを追加または削除したい、私は特定のMyType<void>
についてはジェネリッククラス:タイプ
public class MyType<T>
{
public T getValue() { return value; }
}
を説明し、私は "したいです「getValue」メソッドを「削除」します。 このようなことはありますか?
いやしかし、あなたはおそらく、あなたがしてIMyTypeとして変数を宣言する必要があり、唯一のあなたはそれがそのタイプ
であることを知っているときMyType<T>
を使用したいインターフェース
interface IMyType
{
//...what ever method/properties are shared for all
}
public class MyType<T> : IMyType
{
public T getValue() { return value; }
//...shared methods
}
public class MyTypeOtherSide : IMyType
{
//...shared methods
}
と似た何かを達成することができますジェネリックを使用する目的は、少数の型だけでなく、すべての型に対して機能する汎用型宣言を持つことです。
の番号の操作しかしないとします。次のようにあなたのクラスでの一般的な制約を追加することができます。
public class MyType<T> where T: struct
{
public T getValue() { return value; }
}
void
もstruct
であるしかし、これはまた、GetValue
-methodを持っている一般的な引数void
を持っているタイプを許可します。しかし、Leeが言及したように、タイプMyType<void>
を構築できないので、これは傷つきません。
さらに、すべての数値型が実装し、汎用制約として使用できる共通インターフェイスはありません。唯一の回避策は、GetDouble、GetIntなどのすべてのタイプのメソッドを持つことです。
あなたのご意見ありがとうございました。私はまた、このトリック(Leeから)を使ってすべてを処理しました: https://stackoverflow.com/questions/15362424/method-with-same-name-and-signature-but-return- Cシャープタイプ – CDZ
特定のタイプT、たとえばstringの場合、getValueを存在させないことを意味しますか? –
はい、例です。 int、float、boolの場合はこのメソッドが必要ですが、voidの場合は必要ありません。 – CDZ
追加や削除はどういう意味ですか?あなたがジェネリッククラスを持っているかどうかは関係ありません。あなたがクラスメソッドを定義し、それらのメソッドが利用可能になります。ジェネリックスは基本的にメソッドが異なるタイプで動作することを可能にします。 – john