我如何像动作一样调用动态对象?

时间:2012-07-19 08:03:05

标签: asp.net-mvc c#-4.0 dynamic orchardcms

我正在研究果园建筑。我在显示管理部分遇到了一个奇怪的概念。 在部分视图页面中有一个'函数调用'语法,如Display(Model.Head)。这不是一个函数思想,它是在果园WebViewPage中定义的动态对象。 我想知道如何定义一个动态对象,以便你可以像我提到的那样调用它(并传递一个参数)。

提前感谢。

2 个答案:

答案 0 :(得分:1)

我终于找到了自己! 所有操作都在场景后面的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);
    }
}

答案 1 :(得分:1)

没有粘土的重量较轻的方法是继承内置的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;
     }
}