2017-01-30 20 views
0

私は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がコンパイラで認識されないため、問題が発生します。この単純な例では

多分、私が代わりにIVariableVariable<int>するtheVarを宣言することができますが、それは私が辞書から取り出していると私はかもしれない変数の種類についての事前知識を必要とするので、私はそれを試していませんその知識を常に持っているとは限りません。

myValueは、すべての変数にmyValueという名前のプロパティがあるため、継承/抽象プロパティ(そのようなものがある場合)であっても構いません(名前は異なります)。その場合、私はをinterfaceではなくabstract classにすることができたと思いますが、それでも私はmyValueのタイプのために何を入れるべきかという問題に遭遇します。

theVarのキャストはasisで初めて確認できますか?それがうまくいくかどうかわからない。

私は(1特に秒)のガイダンスのためにこれらの記事を見てきました

Wildcard equivalent in C# generics

C# Generics: wildcards

しかし、私の状況はまだその一例ため、上記の第二の例よりも若干異なっていますvoidを返す抽象メソッドを持っていますが、変数に非voidの一般的な値を返すようにしたいのです。

ありがとうございました。

答えて

0

得ることができます。それは今のところ働いているようだ。しかし、それは非常に安全とは思われません。

public interface Variable 
{ 
    object getValue(); 
    void setValue(object value); 
    Type myType(); 
} 

public class Variable<T>: Variable 
{ 
    private T myValue; 

    public object getValue() 
    { 
     return myValue; 
    } 

    public void setValue(object value) 
    { 
     myValue = (T)value; 
    } 

    public Type myType() { return myValue.GetType(); } 
} 

    Dictionary<string, Variable> vars = new Dictionary<string, Variable>(); 

    Variable<int> age = new Variable<int>(); 
    age.setValue(21); 
    vars.Add("age", age); 
    Variable theAgeVar; 
    vars.TryGetValue("age", out theAgeVar); 
    Console.WriteLine("age = " + theAgeVar.getValue()); 

    Variable<double> height = new Variable<double>(); 
    height.setValue(5.9); 
    Variable theHeightVar; 
    vars.TryGetValue("age", out theHeightVar); 
    Debug.Log("height = " + theHeightVar.getValue()); 

この版画:

年齢= 21

高さ、私は好きではない= 5.9

ことの一つは、私がgetValue()の戻り値の型はobjectもしなければならなかったということです。たとえばmyValueTのタイプ)にIComparableを実装したい場合は、ボクシングが発生するとこの情報は失われ、発信者はobjectを受信します。

1

C#はdynamicである。あなたは

Dictionary<string, dynamic>を作成することもできますし、オブジェクト(boxing/unboxingDictionary<string, object>

を使用するかは、私はボクシング/アンボクシングを使用してみましたし、この解決策を考え出したgeneric type from class

class MyClass<TDicValue> 
{ 
    Dictionary<strint, TDicValue> myDictionary; 
} 
+0

私はUnityを使用していて、ダイナミックはサポートされていないため、残念ながらダイナミックを使用できません。だから私はボクシング/ unboxingを使用してみました。私は以下のソリューションを掲載しました。どうぞご覧ください。ありがとう! – skrilmps

+0

私はUnityを使用していないので、自分で試してみてください。また、クラス宣言から来るジェネリック型でそれを行うこともできます。 – MFatihMAR

+0

申し訳ありませんが、私はそれを入力して、私のためにそれをテストするように聞いていたように聞こえることを意味しませんでした!私はそれを貧弱に言いました。私が意味していたのは、あなたは私のポストを見て、あなたがそのソリューションについて何を考えているのか見てみることができましたか?私はそれをUnityに入力してテストしたが、うまくいきます。しかし、単にコードの動作がそれが防弾であることを意味するわけではありません。 :) – skrilmps