2012-03-07 3 views
0

Возможно ли это в любом другом синтаксисе ???Сетевой общий тип с аргументом общего типа

interface IFoo<T<U>> where U: Bar, new() where T<U>: class, IFoo<T<U>>, new() 

Это способ заставить общий аргумент для IFoo быть универсальным типом

class MyFoo<U>: IFoo<MyFoo<U>> where U: Bar, new() 

Edited проиллюстрировать некоторые моменты:

  • U является бар ... это будет быть организацией-заказчиком
  • T is IFoo ... это был бы бизнес-объект Customer
  • IFoo is interfa в.п. для некоторых бизнес объектов
  • IFoo определяет List<U> GetList(int compareToCustomerProperty)

Edited для иллюстрации удобства:

interface IFoo<T<U>> where U: Bar, new() where T<U>: class, IFoo<T<U>>, new() 
    T<U> DoOnce(); 

class MyFoo<U>: IFoo<MyFoo<U>> where U: Bar, new() 
    MyFoo<U> DoOnce(){return this;} 
    MyFoo<U> DoAgain(){return this;}//this is not in interface 

class Test{ 
    public Test(){ 
     IFoo<MyFoo<Bar>> x = new MyFoo<Bar>();//Generics can come as parameters 
     x. 
      DoOnce()//this is from interface 
      DoAgain();//Can access this x's method cause of generic in IFoo 
    } 
} 

Я в настоящее время осуществить это, но я теряю родовое U.

Может жить без него ?? ? Всего
Я пропущу этот подход в какой-то момент своего кода ??? Неа!

Я только что пришел к точке, где я видел, это было бы неплохо иметь в своем коде (метод цепного между абстрактным & бетоном, больше свободы в дженерик)

спасибо за ответы!

+0

Почему 'IFoo' уход как' U' ограничен? Какой прецедент? –

+0

Привет @ M.Babcock ответил в 4-й точке редактирования –

+0

Понял, но не должен 'IFoo' делегировать ответственность за создание экземпляра' U' 'T '? –

ответ

1

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

public interface IBaz<U> 
{ 
} 

public class Baz<U> : IBaz<U> 
{ 
} 

public interface IFoo<T, U> where T : IBaz<U> where U: Bar, new() 
{ 
}  

public class Foo<U> : IFoo<Baz<U>, U> 
    where U: Bar, new() 
{ 
} 
+0

Привет @ user375487 см. Отношение между IFoo & T –

+0

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

+0

Я вижу ... спасибо @ user375487 –

1

Нет, вы не можете сделать это в рамках .Net.

См., Что не имеет смысла ограничивать аргумент общего типа как самого обобщенного. Рассмотрим следующий вид:

public class StringList : List<string> { } 

StringList и List<string> довольно много такого же типа. Но вы могли бы написать

Foo<List<string>> 

и не

Foo<StringList> 

Тот факт, что List<string> был создан из определения List<> универсального типа не очень актуальны для большинства использования, если вы работаете на каком-то высоком обращении с рефлексией.

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

public interface GenericTypeConverter<T> where T : <> 
{ 
    T<V> Convert<U,V>(T<U> thing); 
} 

Если вы хотите, чтобы создать интерфейс конвертер, который объявляет функции для преобразования из T<U> в T<V> , для любого произвольного общего типа T. Но я могу только представить, что это происходит, если вы работаете над сложным генерированием кода/анализом кода.

И если это так, и вам действительно нужно, что вы всегда можете проверить во время выполнения, если тип T является общим, позвонив по телефону typeof(T).IsGenericType

+0

Спасибо @ d-b Я просто написал пример того, что я пытался сделать –

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