2013-05-24 2 views
1

У меня есть функция, как этотметод Дженерики внутри метода дженериков

public static void serialize<T>(T serializeObject){ 
    //this is the trouble 
    SerializableEntity<T> entity = new SerializableEntity<T>(serializeObject); 
} 

Как я могу сделать, что при использовании дженериков внутри дженериков? Как это сделать?

UPDATE

Здесь ошибка компилятора:

Error image

+7

'// это trouble' Что такое проблема? – I4V

+0

Возможный дубликат [Вызов универсального метода с аргументом типа, известным только во время выполнения] (http://stackoverflow.com/questions/325156/calling-generic-method-with-a-type-argument-known-only-at -execution-time) – Habib

+0

Я получил ошибку компиляции с этим кодом SerializableEntity entity = new SerializableEntity (serializeObject); что не так? – mrhands

ответ

8

Там нет ничего плохого за се с кодом у вас есть: что компилирует нормально:

class SerializableEntity<T> { 
    public SerializableEntity(T obj) { } 
} 
static class P { 
    public static void serialize<T>(T serializeObject) { 
     //this is fine... 
     SerializableEntity<T> entity = 
      new SerializableEntity<T>(serializeObject); 
    } 
    static void Main() { /*...*/ } 
} 

Итак, настоящий вопрос: Что компилятор говорит? Наиболее очевидным было бы, если бы оно произнесло что-то вроде:

The type 'T' must be a reference type in order to use it as parameter 'T' in the generic type or method ' SerializableEntity<T> '

который является нарушением «ограничения»; если это то, что вы видите, вам нужно добавить ограничения на serialize<T>, чтобы доказать компилятору, что ограничения всегда выполняются. Например, если SerializableEntity<T> объявлен как:

class SerializableEntity<T> where T : class 
{...} 

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

public static void serialize<T>(T serializeObject) where T : class 
{...} 

Следует отметить, что другие ограничения возможны, в том числе:

  • : class
  • : struct
  • : SomeBaseType
  • : ISomeInterface
  • : new()
+0

Спасибо за ответ. Я только что искал эту проблему ... Решенный сейчас .. – mrhands

+1

@mrhands совет для следующего раза: включить точное сообщение об ошибке компилятора (идеально скопированное как текст) в вопросе. Или даже лучше: сначала скопируйте сообщение об ошибке в * google * и посмотрите, что говорит интернет ... –

+0

спасибо за совет .. – mrhands

1

Вы, вероятно, имеют различные ограничения на Т в методе и в классе.

Примите во внимание, что если класс говорит:

where T : class, IDisposable 

Тогда метод должен иметь по крайней мере, такое же где

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