6

是否可以像动态创建委托一样

arg => { return something; }
or arg => someting;

使用内置的 DelegateFactoryObject 和 Spring.Net 提供的 Spring 表达式?

我想创建没有编码的工厂。spring文档中的abstract sample需要一个抽象工厂,通过config动态实现工厂方法。我想通过 Spring.Net 定义一个委托和结果。

我已经使用了如下结构。

<object type="Spring.Objects.Factory.Config.DelegateFactoryObject">
  <property name="DelegateType" value="System.Func&lt;string,bool&gt;" />
  <property name="TargetObject" value="aString" />
  <property name="MethodName" value="Equals" />
</object>

<object type="Spring.Objects.Factory.Config.DelegateFactoryObject">
  <property name="DelegateType" value="System.Func&lt;string,My.Interface&gt;" />
  <property name="TargetObject">
    <object id="result" type="My.DelegateContainer&lt;string,My.Interface&gt;">
      <constructor-arg name="objectToReturn" ref="theObjectToReturn" />
    </object>
  </property>
  <property name="MethodName" value="Evaluate" />
</object>

(字符串为输入,My.Interface实现类型为输出,通过ObjectToReturn)

...但我无法找到如何使用表达式来定义通过 xml-config 返回对象的函数的解决方案。我想用一个简单的配置定义的工厂来替换这个例子中的 DelegateContainer,返回 theObjectToReturn。

这个问题与这个问题有关:How to injection Predicate and Func in Spring.net,您可以在那里找到有关该问题的更多信息。

4

1 回答 1

1

我相信您正在尝试使用委托异步调用方法,如果是这样,您可以使用这些方法中的任何一种来使用异步调用作为委托来调用函数:

       Action act = () =>
        { 
             //Function Body            
        };
        //call
        act();


        Action<Action> act2 = (x) =>
        { 
            //Function Body            
        };
        //call
        act2(() => { });

        var tsk = Task.Factory.StartNew(() => {
            //Function Body                     

        });
        //call
        tsk.Wait();

        Parallel.Invoke(() => {
            //Function Body                                 
        }, () => {
            //Function Body                                 
        });

最后,您可以使用 Func<> 如下:

Func<string, int, string> sayHello = delegate(string name, int age)
        {
            return string.Format("my name is {0} and I'm {1} years old.", name, age.ToString());
        };

希望这个帮助,最好的。

于 2013-04-18T02:06:02.687 回答