我正在学习果园建筑。我在展示管理部分遇到了一个奇怪的概念。在部分视图页面中,有一个类似这样的“函数调用”语法Display(Model.Head)
。那不是一个函数思想,它是一个在orchard WebViewPage中定义的动态对象。我想知道如何定义一个动态对象,以便您可以像我提到的函数一样调用它(并传递一个参数)。
提前致谢。
我正在学习果园建筑。我在展示管理部分遇到了一个奇怪的概念。在部分视图页面中,有一个类似这样的“函数调用”语法Display(Model.Head)
。那不是一个函数思想,它是一个在orchard WebViewPage中定义的动态对象。我想知道如何定义一个动态对象,以便您可以像我提到的函数一样调用它(并传递一个参数)。
提前致谢。
我终于找到了我自己!所有操作都在幕后使用 Clay Library 完成。我编写了一个示例控制台应用程序来演示该过程。
class Program
{
static void Main(string[] args)
{
Display = ClayActivator.CreateInstance<MyResponser>(new List<IClayBehavior> {new MyFunctionCallBehavior()});
//this is what i was after
Console.Write(Display("bla bla bla"));
}
public static dynamic Display;
}
public class MyFunctionCallBehavior : IClayBehavior
{
public object InvokeMember(Func<object> proceed, object self, string name, INamedEnumerable<object> args)
{
return ((MyResponser)self).ResponseForRequest(args.FirstOrDefault().ToString());
}
}
public class MyResponser
{
public string ResponseForRequest(string param)
{
return string.Format("This is response for {0}",param);
}
}
一个没有粘土的更轻量级的方法是继承内置的DynamicObject类。
public static dynamic Display;
void Main()
{
Display = new MyCallableObject();
//this is what i was after
Console.Write(Display("bla bla bla"));
}
public class MyCallableObject:DynamicObject
{
public override bool TryInvoke(InvokeBinder binder, object[] args, out Object result)
{
result = string.Format("This is response for {0}",args.FirstOrDefault());
return true;
}
}