2

我想在我通常使用的动态对象中使用Dictionary<string, string>. 我想从

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

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

典型的ExpandoObject会返回一个objectfor dyna.key,有什么简单的方法可以让它在访问每个值时返回字符串而不进行强制转换?


编辑:对不起,我还没有深入研究我的问题——

并不是我正在调用的代码不能将它用作字符串,它有这个:

public static implicit operator SomethingSomething(string name)

这就是它破裂的原因

EDIT2:哎呀,我是个白痴,只有在从头开始重新创建它之后,我才阅读了完整的错误消息:没有名为“GetMyClass”的适用方法,但似乎有一个名为“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 回答