2008-09-18 6 views
-1

Это не законно:Есть ли элегантный способ создания переменной типа с параметрами?

public class MyBaseClass 
{ 
    public MyBaseClass() {} 
    public MyBaseClass(object arg) {} 
} 


public void ThisIsANoNo<T>() where T : MyBaseClass 
{ 
    T foo = new T("whoops!"); 
} 

Для того, чтобы сделать это, вы должны сделать некоторые размышления на объект типа для T или вы должны использовать Activator.CreateInstance. Оба довольно неприятные. Есть ли способ лучше?

ответ

1

Вы не можете ограничить T, чтобы иметь определенный конструктор подписи, кроме пустого конструктора, но вы можете ограничить T иметь фабричный метод с нужной подписью:

public abstract class MyBaseClass 
{ 
    protected MyBaseClass() {} 
    protected abstract MyBaseClass CreateFromObject(object arg); 
} 

public void ThisWorksButIsntGreat<T>() where T : MyBaseClass, new() 
{ 
    T foo = new T().CreateFromObject("whoopee!") as T; 
} 

Однако я предположил бы, возможно, использование другого шаблона создания, такого как Abstract Factory для этого сценария.

0
where T : MyBaseClass, new() 

только работает с беззалоговым общественным конструктором. кроме этого, обратно к activator.CreateInstance (что на самом деле не так плохо).

+0

не в общем виде. – 2008-09-18 20:57:12

2

Nope. Если вы не проходили в параметрах, вы могли бы ограничить свой параметр param, чтобы потребовать конструктор без параметров. Но, если вам нужно передать аргументы, вам не повезло.

-2

Я вижу, что не работает.

Но что мешает вам сделать это?

public void ThisIsANoNo<T>() where T : MyBaseClass 
{ 
    MyBaseClass foo = new MyBaseClass("whoops!"); 
} 

Поскольку все унаследует от MyBaseClass они будут аль быть MyBaseClass, верно?

Я пробовал, и это работает.

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      ThisIsANoNo<MyClass>(); 
      ThisIsANoNo<MyBaseClass>(); 
     } 

     public class MyBaseClass 
     { 
      public MyBaseClass() { } 
      public MyBaseClass(object arg) { } 
     } 

     public class MyClass :MyBaseClass 
     { 
      public MyClass() { } 
      public MyClass(object arg, Object arg2) { } 
     } 

     public static void ThisIsANoNo<T>() where T : MyBaseClass 
     { 
      MyBaseClass foo = new MyBaseClass("whoops!"); 
     } 
    } 
} 
+0

Что произойдет, если у вас есть производный класс, который имеет только конструктор, который принимает 2 аргумента? – 2008-09-18 20:33:56

 Смежные вопросы

  • Нет связанных вопросов^_^