您不能将任何类型的属性(甚至函数)添加到现有类型。
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();//this is NOT checked at compile time
}
现在我可以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"));