2014-07-15 2 views
0

Предполагая следующий метод, и я знаю, что это не работает:Возможно ли создать новый экземпляр родового типа внутри тела общего метода?

Я хочу, чтобы создать новый экземпляр универсального типа

public List<TPer> getDATA<TPer>(TPer per, int acao) where TDal: new() 
{ 
    //Is it possible create a new instance of a generic type inside the body of a generic method? 
    TDal dal = new TDal(); //<-- I know it is NOT OK 
    List<TPer> lst = new List<TPer>(); 

    lst = dal.getDATA(per, acao); 
    return lst; 
} 

Я мог бы написать что-то вроде этого:

List<TPer> getDATA<TPer,TDal>(TPer per, int acao) where TDal: new() 

Но программа, которая будет называть этот метод, не имеет доступа к TDal:

Можно позвонить этот метод использует пустой параметр? или создать новый экземпляр родового типа внутри тела общего метода?

<TDal> также был бы общим, но я не знаю, возможно ли создать его в качестве нового универсального типа внутри этого общего метода в C#.

+0

Я не могу сказать, что вы пытаетесь достичь - или почему вы создаете новый '' List , а затем сразу же отбросить его. Каким образом 'TDal dal = new TDal()' "NOT OK"? –

+0

В первой версии метода не указано, что такое «TDAL» и откуда оно происходит. Что насчет этого? – Jon

+0

Было бы лучше, если бы вы отредактировали ваш [предыдущий вопрос] (http://stackoverflow.com/q/24739303/1043380), вместо того, чтобы перепоставлять. – gunr2171

ответ

0

Вы можете использовать свой общий тип интерфейса. Затем поместите ограничения в свой общий метод, чтобы принимать только типы, реализующие этот интерфейс. Это позволит вам вызывать методы для вашего вновь созданного объекта, поскольку, как известно, эти методы.

public interface ITest 
{ 
    void DoSomething(); 
} 

public void GetData<T, U>(T varA, int acao) where U: ITest, new() 
{ 
    var item = new U(); 
    item.DoSomething(); 
} 
+0

Большое спасибо. Мне понравился этот ответ. Ну, мои знания в C# и дженериках это не очень продвинутые, и мой реальный проект намного сложнее, чем код в этом вопросе, но я постараюсь реализовать ваше предложение. – nandox

+0

Если это решение можно реализовать, отметьте его как правильный ответ. – impr0t

+0

Это не совсем то, что я хотел, но это помогло мне лучше разобраться с дженериками. Хотелось бы подождать немного больше, если возможно, для получения дополнительных ответов. Может быть, если я помечаю правильный ответ, люди больше не будут давать ответы. – nandox

0

Как может общий getDATA узнать, что такое TDAL? она должна быть объявлена ​​в методе GetData или в классе, содержащий метод т.е.

class MyGenericClass<TDal> where TDal:new() 
{ 
    public List<TPer> getDATA<TPer>(TPer per, int acao) where TDal : new() 
    { 
     TDal dal = new TDal(); 
     List<TPer> lst = new List<TPer>(); 

     lst = dal.getDATA(per, acao); 
     return lst; 
    } 
} 

В обоих случаях вызывающий абонент должен знать TDal.

Если вам нужно избежать этого, вы можете сделать что-то в getDATA, что из per.GetType() извлекает тип TDal, а затем создает экземпляр этого класса. I.e.

public List<TPer> getDATA<TPer>(TPer per, int acao) 
    { 

     List<TPer> lst = new List<TPer>(); 

     IDal dal; 

     switch (per.GetType().Name) 
     { 
      case "Person": 
       dal = new DalPerson(); 
       break; 
      case "Car": 
       dal = new DalCar(); 
       break; 
      default: 
       throw new InvalidOperationException("I dont like per"); 
     } 

     lst = dal.getDATA(per, acao); 
     return lst; 
    } 
Смежные вопросы