0

我最近一直在研究一个通用工厂,它绕过了关于带参数的构造函数的“where”约束,由于一个错误,我遇到了一些我不太理解的东西,想知道是否有人能够发光在上面。

有问题的代码行是:

ITestInterface myObj = new GenericFactory<ITestInterface>(
    () => (new TestClass("username", "password"))
).CreateObject() as ITestInterface;

ITestInterface myNewObj = new GenericFactory<ITestInterface>(
    (string x, string y) => (new TestClass(x, y))
).CreateObject("username ", " password") as ITestInterface;

这两行都做同样的事情,但我预计第一行会失败。

工厂代码如下:

public GenericFactory (Func<T> getNewT)
{
   _getNewObject = getNewT;
}

public GenericFactory(Func<string, string, T> getNewT)
{
   _getNewObjectTwoParams = getNewT;
}

public T CreateObject ()
{
   if (_getNewObject == null)
   {
      return default(T);
   }
   else
   {
       return _getNewObject();
   }
}

public T CreateObject (string username, string password)
{
   if (_getNewObjectTwoParams == null)
   {
      return default(T);
   }
   else
   {
      return _getNewObjectTwoParams(username, password);
   }
}

TestClass 具有以下构造函数:

public TestClass (string name, string password)
{
   _name = name;
   _password = password;
}

如果有人能阐明为什么第一次致电工厂有效,我将不胜感激。

谢谢。

4

1 回答 1

2

这当然看起来像是很多开销,相当于:

ITestInterface test = new TestClass("username", "password");

但是,它工作得很好的原因是因为您使用的是第一个构造函数覆盖:

public GenericFactory (Func<T> getNewT)

您可以传入任何Func<T>返回T. 你可以在这个函数中做更多的事情:

ITestInterface myObj = new GenericFactory<ITestInterface>(
    () => {
    var username = GetMyUserName();
    var password = GetMyPassword();
    return new TestClass(username, password)
}).CreateObject() as ITestInterface;
于 2012-05-02T14:50:58.760 回答