-4

実行時にオーバーライドする必要がある不定型の変数を含むクラスがあります。これを行うにはどうすればよいですか?

嫌な質問で申し訳ありません(例:

public class MyClass 
{
     public e_Type TypeValue;
     public (variable of indeterminate type) Value;
}


public enum e_Type
{
    string, int, bool, byte
}

実行時に、変数 TypeValue は変数 Value の型を決定する必要があります

4

4 に答える 4

4

実際の意味に応じて、 または のいずれかを使用する必要がありvarますdynamic

キーワードはvar、実際に使用している型をコンパイラに判断させるだけです。割り当てるデータが実行時に本当に動的である場合、あまり役に立ちません。ほとんどのvar場合、シンタックス シュガーと見なすべきです (場合によっては非常に役立つシュガーになることもありますが)。

このdynamicキーワードを使用すると、真に動的なオブジェクトを作成できます。つまり、何を割り当てようとしても、コンパイラ エラーや実行時エラーが発生しません。後で、存在しないプロパティを呼び出そうとすると、実行時エラーが発生します。これは本質的に、あなたがコンパイラーに「ねえ、ほら、このオブジェクトについて大騒ぎしないで、私がそれに何かを代入し、それに対して何かを呼び出すことを許可してください.

使用を考えているときはいつでも、目前dynamicの問題を検討し、より良い方法 (インターフェイス、ジェネリックなど) で解決できるかどうかを確認する必要があると思います。

于 2012-07-26T07:40:51.040 に答える
2

あなたは本当にジェネリックを求めているようです:

class Foo<T>
{
    public T Value { get; set; };
}

次に、さまざまなタイプのインスタンスを作成できます。

Foo<string> x = new Foo<string>();
x.Value = "fred";

Foo<int> y = new Foo<int>();
y.Value = 10;

これはまだコンパイル時に型を修正していますが、型を使用するコードがコンパイルされるときです。

varここでは完全に間違っています -暗黙的に型指定されたローカル変数varに使用されるだけです。特に、フィールドには適用できません。

あなたが望む可能dynamicはありますが、現時点ではあなたの質問からは明確ではありません。

于 2012-07-26T07:41:04.733 に答える
2

これは、キーワード var を使用して行う必要があることを知っています

いいえ、そうではありませんvar。うまくいくと思い浮かぶことが3つあります

  • object; 何でも保存できますが、有用なことを行うにはリフレクションが必要です
  • dynamic; obj.SomeMethod()(etc) が実行時に解決されるようなブードゥーをコンパイラが実行するオブジェクトの特殊なケース
  • ジェネリックス、つまりクラス beSomeType<T>を持ち、変数の型は as T; 一般的な制約Tにより、必要な機能 (インターフェイス) を宣言することで、これをより使いやすくすることができます。
于 2012-07-26T07:41:28.730 に答える
0

var何かを宣言するのではなく、何かを参照することを目的としています。それは逆です。

(C#4のみ!)を活用してこれを達成しましたSystem.Dynamic.ExpandoObject。プロパティを宣言せずに自由に追加でき、実行時に解決されます(PHPがオブジェクトを処理する方法に似ており、私はその大ファンです) 。

簡単な例:

dynamic myObject = new ExpandoObject();
myObject.myProperty = "You can declare properties on-the-fly inside me !";
Console.WriteLine(myObject.myProperty);
于 2012-07-26T07:49:11.533 に答える