私はオーチャード アーキテクチャを研究しています。ディスプレイ管理セクションで奇妙な概念に直面しました。部分ビュー ページには、 so のような「関数呼び出しのような」構文がありますDisplay(Model.Head)
。これは関数ではなく、オーチャード WebViewPage で定義された動的オブジェクトです。私が言及したように、関数のように動的オブジェクトを呼び出す(そして引数も渡す)ことができるように、動的オブジェクトを定義する方法を考えています。
前もって感謝します。
私はオーチャード アーキテクチャを研究しています。ディスプレイ管理セクションで奇妙な概念に直面しました。部分ビュー ページには、 so のような「関数呼び出しのような」構文がありますDisplay(Model.Head)
。これは関数ではなく、オーチャード WebViewPage で定義された動的オブジェクトです。私が言及したように、関数のように動的オブジェクトを呼び出す(そして引数も渡す)ことができるように、動的オブジェクトを定義する方法を考えています。
前もって感謝します。
粘土を使わずに軽量化する方法は、組み込みの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;
}
}
私はついにそれを自分自身で見つけました!すべての操作は、舞台裏で 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);
}
}