假设我有以下课程:
public class Person {
public string Name { get; set; }
public string Surname { get; set; }
public string FullName {
get {
return Name + " " + Surname;
}
}
}
以下块:
Person person = new Person();
person.Name = "Matt";
person.Surname = "Smith";
return person.FullName;
会回来Matt Smith
.
让我们改变我们的Person
键入动态ExpandoObject
.
代码如下所示:
dynamic person = new ExpandoObject();
person.Name = "Matt";
person.Surname = "Smith";
但这就是我被困住的地方。我怎样才能覆盖get
新的访问者FullName
财产?
我可以通过创建新方法来达到相同的效果:
person.GetFullName = (Func<string>)(() => {
return person.Name + " " + person.Surname;
});
但这最终会得到一个方法而不是一个属性,因此这样调用它:
person.GetFullName();
EDIT
请注意,我不想知道如何定义或创建新的动态属性。我想知道如何重写或定义动态属性的 get 访问器。
我想象代码可能是这样的:
person.FullName.get = (Func<string>)(() => {
return person.Name + " " + person.Surname;
});
然后,像这样调用:
Console.WriteLine(person.FullName); //Prints out "Matt Smith"
dynamic person = new GetterExpando();
person.Name = "Matt";
person.Surname = "Smith";
person.FullName = new GetterExpando.Getter(x => x.Name + " " + x.Surname);
Console.WriteLine(person.FullName); // Matt Smith
// ...
public sealed class GetterExpando : DynamicObject
{
private readonly Dictionary<string, object> _data = new Dictionary<string, object>();
public override bool TrySetMember(SetMemberBinder binder, object value)
{
_data[binder.Name] = value;
return true;
}
public override bool TryGetMember(GetMemberBinder binder, out object result)
{
object value;
if (_data.TryGetValue(binder.Name, out value))
{
var getter = value as Getter;
result = (getter == null) ? value : getter(this);
return true;
}
return base.TryGetMember(binder, out result);
}
public delegate object Getter(dynamic target);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)