2

通常使用する動的オブジェクトを使用したいDictionary<string, string>。から行きたい

dict.Add("key", "value");
string val = dict["key"];

 dyna.key = "value";
 string val = dyna.key

通常ExpandoObjectobjectfordyna.keyを返しますが、各値にアクセスするときにキャストせずに文字列を返すようにする簡単な方法は何ですか?


編集:申し訳ありませんが、私は私の問題を十分に掘り下げていません-

私が呼び出しているコードがそれを文字列として使用できないわけではありません、それはこれを持っています:

public static implicit operator SomethingSomething(string name)

だから壊れます

EDIT2:ウェルプ、私はばかです。最初から再作成した後でのみ、エラーメッセージ全体を読みました。「GetMyClass」という名前の適用可能なメソッドはありませんが、その名前の拡張メソッドがあるようです。拡張メソッドを動的にディスパッチすることはできません。動的引数をキャストするか、拡張メソッド構文なしで拡張メソッドを呼び出すことを検討してください。

4

2 に答える 2

4

通常の ExpandoObject は dyna.key のオブジェクトを返します

ええと、正確ではありませんが、返すように指示したものは何でも返します。

dynamic dyna = new ExpandoObject();
dyna.key = "value";
string val = dyna.key;

もちろん、コンパイル時のチェックに頼ることはできなくなり、次のコードは実行時に明らかにクラッシュします。

dynamic dyna = new ExpandoObject();
dyna.key = "value";
int val = dyna.key;

そのため、値を格納するために使用したものと同じ型を使用していることを確認してください。


アップデート:

class Program
{
    static void Main()
    {
        dynamic dyna = new ExpandoObject();
        dyna.key = "value";
        Test(dyna.key);
    }

    public static void Test(string message)
    {
        Console.WriteLine(message);
    }
}

更新 2:

問題が何であるかはまだわかりません:

class Program
{
    static void Main()
    {
        dynamic d = new ExpandoObject();
        d.key = "value";
        Program p = d.key;
        Console.WriteLine(p.Name);
    }

    public string Name { get; set; }

    public static implicit operator Program(string name)
    {
        return new Program
        {
            Name = name
        };
    }
}
于 2012-08-28T14:46:56.230 に答える
2

ではdynamic、すべてのキャストが暗黙的であるため、次のようになります。

dynamic key = ...
dyna.key = "value";
string val = dyna.key;

すでに仕事をしています。

より正確には、メンバー アクセス ( .key) は を返しますdynamic。このdynamic結果には、ターゲット型 への暗黙的なキャスト (実行時に検証される型チェック) がありますstring

于 2012-08-28T14:47:35.737 に答える