有一个代码:
using System.Dynamic;
class PersonObject : DynamicObject
{
Dictionary<string, object> members = new Dictionary<string, object>();
// установка свойства
public override bool TrySetMember(SetMemberBinder binder, object value)
{
members[binder.Name] = value;
return true;
}
// получение свойства
public override bool TryGetMember(GetMemberBinder binder, out object result)
{
result = null;
if (members.ContainsKey(binder.Name))
{
result = members[binder.Name];
return true;
}
return false;
}
// вызов метода
public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result)
{
dynamic method = members[binder.Name];
result = method((int)args[0]);
return result != null;
}
}
这里的 binder 用于按名称引用属性和方法。所以问题是:除此之外,它是否还有其他用途?如果是,那为什么?除了处理动态对象之外,还可以在哪里使用活页夹?然后我对编译器确定对 PersonObject 类中定义的方法的调用的逻辑感兴趣。他怎么理解那行 person.Name = "Tom"; 调用 TrySetMember() 方法以及为什么不能以通常的方式将其传递给带参数的函数,比方说 TrySetMember(SetMemberBinder binder=Name,object value=Tom),同样适用于编译器定义逻辑,启动TryGetMember、TryInvokeMember 方法分别基于返回 person 表达式 .Age 和 person.IncrementAge(4)。
此类专为这种情况而设计 - 使用 DynamicObject。
一些图书馆可能有自己的活页夹。
它被硬连线到编译器中。在解析 C# 代码的阶段,解析器遇到从 DynamicObject 派生的类型,将此字符串转换为创建和填充活页夹实例的代码,并将其作为输入提供给此方法
你有机会进入词法分析和生成 IL 代码的阶段吗?
你的问题的本质不清楚。您不需要手动创建和填充这些活页夹。这就是词法分析器/解析器/编译器所做的。你只要写
person.Age = 33。一切!