私はC#を初めて使用しています。私は、そのJavaの等価であるC#で辞書を実装しようとしています:Java how to manage user-defined variablesC##ジェネリッククラスの辞書
これまでのところ、私のようなものを持っているC#の場合:ここで
HashMap<string, Variable<?>> dictionary
は、私が何をしようとしているの詳細なJavaのバージョンがありますこの:
interface IVariable { }
public class Variable<T> : IVariable
{
public T myValue { get; set; }
}
Dictionary<string, IVariable> vars = new Dictionary<string, IVariable>();
その後、私はこれを行うにしてみてください。
Variable<int> age = new Variable<int>();
age.myValue = 12;
vars.Add("age", age);
IVariable theVar;
if (vars.TryGetValue("age", out theVar) {
Console.WriteLine("fetched age is " + theVar.myValue);
}
私は私を実行します最後の行では、IVariable
であるため、theVar
のメンバーであるmyValue
がコンパイラで認識されないため、問題が発生します。この単純な例では
多分、私が代わりにIVariable
のVariable<int>
するtheVar
を宣言することができますが、それは私が辞書から取り出していると私はかもしれない変数の種類についての事前知識を必要とするので、私はそれを試していませんその知識を常に持っているとは限りません。
myValue
は、すべての変数にmyValue
という名前のプロパティがあるため、継承/抽象プロパティ(そのようなものがある場合)であっても構いません(名前は異なります)。その場合、私はをinterface
ではなくabstract class
にすることができたと思いますが、それでも私はmyValue
のタイプのために何を入れるべきかという問題に遭遇します。
theVar
のキャストはas
でis
で初めて確認できますか?それがうまくいくかどうかわからない。
:
Wildcard equivalent in C# generics
しかし、私の状況はまだその一例ため、上記の第二の例よりも若干異なっていますvoidを返す抽象メソッドを持っていますが、変数に非voidの一般的な値を返すようにしたいのです。
ありがとうございました。
私はUnityを使用していて、ダイナミックはサポートされていないため、残念ながらダイナミックを使用できません。だから私はボクシング/ unboxingを使用してみました。私は以下のソリューションを掲載しました。どうぞご覧ください。ありがとう! – skrilmps
私はUnityを使用していないので、自分で試してみてください。また、クラス宣言から来るジェネリック型でそれを行うこともできます。 – MFatihMAR
申し訳ありませんが、私はそれを入力して、私のためにそれをテストするように聞いていたように聞こえることを意味しませんでした!私はそれを貧弱に言いました。私が意味していたのは、あなたは私のポストを見て、あなたがそのソリューションについて何を考えているのか見てみることができましたか?私はそれをUnityに入力してテストしたが、うまくいきます。しかし、単にコードの動作がそれが防弾であることを意味するわけではありません。 :) – skrilmps