プリミティブに渡される型を強制/制限する方法はありますか? (bool、int、string など)
これで、ジェネリック型パラメーターをwhere句を介して型またはインターフェイスの実装に制限できることがわかりました。ただし、これはプリミティブ (AFAIK) の法案には適合しません。なぜなら、それらはすべて共通の基盤を持っているわけではないからです (誰かが言う前のオブジェクトは別として!:P)。
したがって、私の現在の考えは、歯を食いしばって大きなswitchステートメントを実行し、失敗時にArgumentExceptionをスローすることです。
編集1:
明確にするために:
コード定義は次のようになります。
public class MyClass<GenericType> ....
そしてインスタンス化:
MyClass<bool> = new MyClass<bool>(); // Legal
MyClass<string> = new MyClass<string>(); // Legal
MyClass<DataSet> = new MyClass<DataSet>(); // Illegal
MyClass<RobsFunkyHat> = new MyClass<RobsFunkyHat>(); // Illegal (but looks awesome!)
編集2
@Jon Limjap - 良い点、そして私がすでに考えていたこと。型が値型か参照型かを判断するために使用できる汎用メソッドがあると確信しています。
これは、処理したくない多くのオブジェクトを即座に削除するのに役立ちます (ただし、Sizeなどの使用される構造体について心配する必要があります)。興味深い問題はありませんか?:)
ここにあります:
where T: struct
MSDNから取得。
私は興味がある。これは、拡張メソッドを使用して .NET 3.x で実行できますか? インターフェイスを作成し、そのインターフェイスを拡張メソッドに実装します (これはおそらく少し太ったスイッチよりもクリーンです)。さらに、後で軽量のカスタム型に拡張する必要がある場合は、基本コードを変更する必要なく、同じインターフェイスを実装することもできます。
皆さんはどう思いますか?
悲しいニュースは、私は Framework 2 で作業していることです!! :D
編集3
これは、Jon Limjaps Pointerに続くとてもシンプルなものでした。とてもシンプルで泣きそうになりましたが、コードが魔法のように機能するので素晴らしいです!
それで、これが私がやったことです(あなたは笑うでしょう!):
ジェネリック クラスに追加されたコード
bool TypeValid()
{
// Get the TypeCode from the Primitive Type
TypeCode code = Type.GetTypeCode(typeof(PrimitiveDataType));
// All of the TypeCode Enumeration refer Primitive Types
// with the exception of Object and Empty (Null).
// Since I am willing to allow Null Types (at this time)
// all we need to check for is Object!
switch (code)
{
case TypeCode.Object:
return false;
default:
return true;
}
}
次に、型をチェックして例外をスローするためのちょっとしたユーティリティ メソッド、
private void EnforcePrimitiveType()
{
if (!TypeValid())
throw new InvalidOperationException(
"Unable to Instantiate SimpleMetadata based on the Generic Type of '" + typeof(PrimitiveDataType).Name +
"' - this Class is Designed to Work with Primitive Data Types Only.");
}
あとは、クラス コンストラクターでEnforcePrimitiveType()を呼び出すだけです。仕事終わり!:-)
唯一の欠点は、設計時ではなく実行時 (明らかに) にのみ例外をスローすることです。しかし、それは大したことではなく、 FxCopのようなユーティリティ(職場では使用していません) で解決できます。
これについて Jon Limjap に感謝します!