我需要一些帮助DLR。 我采取的IDynamicMetaObjectProvider和DynamicMetaObject,但我有一些问题得到预期的返回类型。 我在元对象overiding BindInvokeMember,我可以看到所有的ARGS类型,但没有返回类型。 任何人都知道,如果可能的话我怎么得到它? 我知道返回类型是动态的,但如果你调用的是依赖于返回类型是什么。 我不知道在DynamicMetaObject要执行的操作,除非我知道返回类型消费者的期待。
更新两个
我不能粘贴在这里我实际的代码,因为它要求各类工作的东西。 一些样品的动态对象的代码如下。
public class TestDynamicMetaObject : DynamicMetaObject
{
public TestDynamicMetaObject(Expression expression, object value)
: base (expression, BindingRestrictions.Empty, value)
{
}
public override DynamicMetaObject BindInvokeMember(InvokeMemberBinder binder, DynamicMetaObject[] args)
{
Delegate method = new Func<int>(Test);
return new DynamicMetaObject(
Expression.Call(method.Method),
BindingRestrictions.GetInstanceRestriction(Expression,Value),
Value
);
}
public static int Test()
{
return 10;
}
}
public class TestDynamicObject : IDynamicMetaObjectProvider
{
DynamicMetaObject IDynamicMetaObjectProvider.GetMetaObject(Expression parameter)
{
return new TestDynamicMetaObject(parameter, this);
}
}
这里是我使用。
static void Main(string[] args)
{
try
{
dynamic x = new TestDynamicObject();
int gg= x.Test();
Console.WriteLine(gg);
}
catch (Exception excep)
{
Console.WriteLine(excep);
}
Console.ReadLine();
}
以下是编译器创建的代码。
private static void Main(string[] args)
{
try
{
object x = new TestDynamicObject();
if (<Main>o__SiteContainer0.<>p__Site1 == null)
{
<Main>o__SiteContainer0.<>p__Site1 = CallSite<Func<CallSite, object, int>>.Create(new CSharpConvertBinder(typeof(int), CSharpConversionKind.ImplicitConversion, false));
}
if (<Main>o__SiteContainer0.<>p__Site2 == null)
{
<Main>o__SiteContainer0.<>p__Site2 = CallSite<Func<CallSite, object, object>>.Create(new CSharpInvokeMemberBinder(CSharpCallFlags.None, "Test", typeof(Program), null, new CSharpArgumentInfo[] { new CSharpArgumentInfo(CSharpArgumentInfoFlags.None, null) }));
}
Console.WriteLine(<Main>o__SiteContainer0.<>p__Site1.Target(<Main>o__SiteContainer0.<>p__Site1, <Main>o__SiteContainer0.<>p__Site2.Target(<Main>o__SiteContainer0.<>p__Site2, x)));
}
catch (Exception excep)
{
Console.WriteLine(excep);
}
Console.ReadLine();
}