2016-11-27 27 views
-1

C#で問題の「型」については確信しています。C#クラス内の変数を再定義する

「item」という作業名のクラスがあるとします。 このクラスには、「変数」などのフィールドがあります。 このフィールドは、プログラム内の要素のフィールドと一致する必要があります。ブールint16、int32、int64、double、uint、uint16。

依存関係にある変数の型を再定義する可能性はありますか? また、この問題に対する他の方法もありますか?

私はこの変数の定義をvarまたはobjectとして考えていましたが、それを与えられた型に投影しました。

値の割り当てが範囲を超えないと、後でチェックするのが問題ですか?

+1

何を?私はあなたが求めていることを理解するのに苦労しています。 – jdphenix

+0

この変数の使い方のサンプルコードを示してください。 – CodeCaster

+0

あなたはgenericsを調べるべきです – Jonesopolis

答えて

0

Itemの使い方に応じて、ジェネリックまたはdynamicのいずれかを使用できます。

、ジェネリック医薬品のアプローチを使用するなどのItemを定義するには:

class Item<T> { 
    public T Variable { get; set; } 
} 

をあなたはそのVariable intでアイテムをしたい場合は、この操作を行います。あなたはそのVariableアイテムが欲しいとき

var intItem = new Item<int>() 
// you can set the Variable property to an int now! 
intItem.Variable = -1; 

をこれは何ですか?

var byteItem = new Item<byte>() 
// you can set the Variable property to a byte 
byteItem.Variable = 10; 

など...

このアプローチの1つの特徴は、アイテムが作成されるとアイテムのVariableのタイプを変更できないことです。だから、これは不可能です。

intItem.Variable = "Hello"; 

あなたは新しいアイテムを作成することなく、他の何かにそのタイプを変更したい場合は、動的変数を使用する必要があります。

class Item { 
    public dynamic Variable {get; set;} 
} 

あなたは今、このような何かを行うことができます:

var myItem = new Item(); 
myItem.Variable = "Hello"; 
myItem.Variable = 10; 

これは基本的にobjectとしてVariableの定義と同じであるが、それはobjectとの間のキャスト、あなたの時間を節約できます希望のタイプ。

値が範囲外であるかどうかの確認については、dynamicを使用するとチェックするのが少し難しいかもしれません。しかし、私はこの小さなテストを行なったし、値がオーバーフローしたときに、それだけで周りにラップすることがわかった: `項目 `タイプと間違っ

var item = new Item(); 
item.Variable = byte.MaxValue; 
item.Variable++; 
Console.WriteLine(item.Variable); // prints 0 
+0

ありがとう、これはそれです。そのシンプルで使いやすい。ご挨拶 –

+0

@MichałGałkowski私の答えがあなたの質問に答えると思うなら、それを受け入れることを検討してください! – Sweeper

-1

ジェネリックを使用することができます。新しいタイプのオブジェクトを作成すると、自動的にコード定義のクラス定義が作成されます。

public class GenericClass<T> 
{ 
    public T MyProperty { get; set; } 

    public void TestMethod() 
    { 
     Console.WriteLine(MyProperty.ToString()); 
    } 
} 

その後、あなたは別のタイプで

 var myIntClass = new GenericClass<int>(); 
     var myStringClass = new GenericClass<string>(); 
     myIntClass.MyProperty = 1; 
     myStringClass.MyProperty = "test"; 

     myIntClass.TestMethod(); 
     myStringClass.TestMethod(); 

をそれを使用することができますまた、一般的なクラスは、特定のインターフェイスを実装する必要がありますように、制約を置くクラスで、コンストラクタを持つことができます。 パブリックインターフェイスIPrintable { void Print(); }

public class GenericClassWithConstraint<T> where T : IPrintable 
{ 
    public T MyProperty { get; set; } 

    void Print() 
    { 
     MyProperty.Print(); 
    } 
} 

また、動的新しいキーワードをチェックアウトすることがあります。実行時にオブジェクト上で作業することができます

+1

これがどのように機能し、OPの質問に答える理由を説明してください。 –

+0

これは、 "あるいはこの問題の他のアプローチはありますか?"という概念に対処していますが、実際には "問題は、後で値を割り当てるときのチェックが範囲を超えないことですか?対処するためにOPによってより明確にする必要がある実際の問題です..私は 'List >'がそれのスコープになると思うが、まだ未知である。 –

関連する問題