你无法向一个已存在的类型添加任何类型的属性(包括函数)。
dynamic d = new Duck();
d.Quack = "Quack";//fails because there is no such property on duck
你可以使用 ExpandoObject :
dynamic d = new ExpandoObject();
d.Quack = (Action)(() => System.Console.WriteLine("1"));
d.Quack();
不要被动态类型所迷惑。
void speak(dynamic d)
{
d.Quack();
}
现在我可以这样做:
speak(new Duck());
和
speak(new Goose());
,如果
Duck
和
Goose
都有
Quack()
方法,它将编译并运行,否则会引发一个异常(与您得到的相同)。
当您在
dynamic
类型上调用方法/属性时,它只在运行时解析,不进行编译器检查。
ExpandoObject允许您即时创建属性。
回答您评论中的问题,我认为,如果您需要自己的类来创建新属性,则可以从
DynamicObject继承。像这样(改编自
此 msdn 页面):
class DynamicDuck : DynamicObject
{
Dictionary<string, object> dictionary
= new Dictionary<string, object>();
public int Count
{
get
{
return dictionary.Count;
}
}
public override bool TryGetMember(
GetMemberBinder binder, out object result)
{
string name = binder.Name.ToLower();
return dictionary.TryGetValue(name, out result);
}
public override bool TrySetMember(
SetMemberBinder binder, object value)
{
dictionary[binder.Name.ToLower()] = value;
return true;
}
}
那么,您可以执行以下操作:
dynamic d = new DynamicDuck();
d.firstname = "Gideon";
d.Quack = (Action)(() => System.Console.WriteLine("Quack"));