5

プリミティブ (または ICloneable) 型のみを処理できるクラスを作成しました

次のようなことが言えるかどうか知りたいです。

 public myobject(primitiv original){...}

または、次のようなプリミティブ型ごとにコンストラクターを作成する必要がありますか?

 public myobject(int original){...}
 public myobject(bool original){...}
 ...

私が達成しようとしているのは、Value、Original、IsDirty の 3 つのパブリック プロパティを持つオブジェクトを作成することです。
値はオリジナルのディープ クローンになるため、オリジナルはプリミティブまたは ICloneable である必要があります。

4

4 に答える 4

6

API を使用しているユーザーにそのような型を強制的に使用させたい場合 (間違った型を使用した場合にコンパイル時のエラーが発生します)、残念ながらそれはできません。

ただし、コンストラクターで を受け取り、objectその型を評価しArgumentException、パラメーターが「プリミティブ」型でも implements でもない場合にをスローすることはできますICloneable

編集:これは役に立つかもしれません。次のコードを使用して、変数がプリミティブ型に属しているかどうかを判断できます。

Type t = foo.GetType();
t.IsPrimitive; // so you don't have to do an evaluation for each primitive type.
于 2013-06-17T13:35:30.007 に答える
6

C# のプリミティブ型は、構造体として定義されます (一般ValueTypeに、.NET CLR のように実装されます)。次の 2 つのオプションがあると思います。

  1. すでに述べたように: 任意の型を受け取り、受け入れ可能なすべての型に対してチェックし、一致しない場合は例外をスローします。
  2. クラスをジェネリックにし、コンストラクターをwhere T : struct(T型パラメーターである) という制約でジェネリックにします。これは、プリミティブ型だけでなく、すべての構造体をキャッチしますが、手動チェックやコンパイル時のチェックなしで期待できる最善の方法だと思います。もちろん、この制約を他の制約と組み合わせることができます。

また、上記の 2 つのオプションを組み合わせて、チェックの一部をコンパイル時に行い、一部を実行時に行うことができます。

于 2013-06-17T13:51:18.063 に答える
2

それはまさにあなたが尋ねたものではありませんが、構造体用と ICloneable 用の 2 つのコンストラクターを使用できます。

 public myobject(System.ValueType original){...}
 public myobject(ICloneable original){...}
于 2013-06-17T13:49:55.517 に答える
-2

リフレクションの代わりにジェネリックはどうですか?

public class MyObject<T>
    where T: IComparable
{
    public MyObject(T original)
    {
        // do runtime check
    }
}


var c1 = new MyObject<int>(1);
// or
var c2 = new MyObject<Int32>(2);
于 2013-06-17T13:50:39.030 に答える