2016-02-25 6 views
6

Это создает ошибку, говоря, что я не могу преобразовать типа ClassType к T. Есть ли обходной путь для этого?роли объекта метода универсального типа

Есть ли способ, чтобы указать, что тип thisможет фактически быть преобразованы в T?

public void WorkWith<T>(Action<T> method) 
{ 
    method.Invoke((T)this); 
} 

ответ

3

два возможных решения:

Не типизированного:

public void WorkWith<T>(Action<T> method) 
{ 
    method.Invoke((T)(object)this); 
} 

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

WorkWith((string x) => Console.WriteLine(x)); 

типизированного «версия» (с помощью общих ограничений):

public class MyClass 
{ 
    public void WorkWith<T>(Action<T> method) where T : MyClass 
    { 
     method.Invoke((T)this); 
    } 
} 

Дело в том, что, чтобы быть в состоянии бросить this в T, компилятор хочет быть уверен, что this всегда литьевой к T (поэтому необходимость для ограничения). Как показано в примере небезопасного типа, «классическое» (небезопасное) решение, используемое с дженериками, проходит через литье до object.

+0

Даже если у пользователя ниже, возможно, был неправильный ответ, это было неоднозначно, поэтому я его отредактировал и принял. Этот ответ также очень хорош, потому что он не был двусмысленным и показывает результат в контексте с объяснением. Я хотел бы принять оба, но хорошо. – KthProg

+0

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

+0

@ Selman22 Мне плохо для оригинального плаката, но я должен согласиться. Изменено. – KthProg

3
public void WorkWith<T>(Action<T> method) where T: ClassType { 
    method.Invoke((T)this); 
} 
+0

Спасибо! Я не знал, как ограничить типы шаблонов для методов! – KthProg

+0

приветствуется –

+0

В то время как вы здесь, любая идея, как указать несколько возможных классов, которые все производятся из 'class'? Несколько классов, перечисленных после 'where T:', похоже, нарушают его. – KthProg