C # Общие классы и кастинг с WCF - PullRequest
1 голос
/ 29 мая 2009

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

class Base {}
class Inherited : Base {}

class MyGeneric<T> {}

// WCF Service interface
void Foo(MyGeneric<Base> b);

// somewhere else
MyGeneric<Inherited> inherited;
Foo(inherited)

Я знаю, что это можно сделать в C # 4.0, но пока это не помогает.

  • Я мог бы написать специализированный класс для каждого MyGeneric<T> созвездия, и там написать неявный преобразователь типов или реализовать определенный интерфейс. Но я хочу этого избежать.
  • Я мог бы иметь интерфейс без универсального, но весь смысл универсального в этом случае заключается в обеспечении безопасности типа времени компиляции для метода Foo. Так что это не вариант.
  • Поскольку Foo является контрактом на эксплуатацию, он не может быть общим.

Есть идеи, как решить эту проблему в C # 3.0?

Ответы [ 3 ]

1 голос
/ 29 мая 2009

Вы хотите:

void Foo<T>(MyGeneric<T> b) where T : Base {}
0 голосов
/ 29 мая 2009

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

Целью приведения таким образом (к типу, который не входит в происхождение экземпляра), является нарушение безопасности типов. Не нарушайте безопасность типов, чтобы сохранить безопасность типов.

0 голосов
/ 29 мая 2009

Я написал этот метод приведения

public MyGeneric<TTarget> Cast<TTarget, TSource>()
  where TTarget : class
  where TSource : TTarget, T
{
  return new MyGeneric<TTarget>();
}

который можно назвать так

MyGeneric<Inherited> inherited;
Foo(inherited.Cast<Base, Inherited>());

Ужасно то, что нужно предоставить класс, которым он уже является. Возможно, возможно некоторое улучшение.

Кстати, мне не удалось сделать это методом расширения, чтобы избежать второго универсального аргумента.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...