2016-02-08 5 views
0

Рассмотрим этот метод:Есть ли способ получить общий тип из метода расширения?

public static TResult CastTo<T, TResult>(this T arg) 
     { 
      TypeConverter typeConverter = TypeDescriptor.GetConverter(typeof(T)); 
      bool? converter = typeConverter?.CanConvertTo(typeof(TResult)); 
      if (converter != null && converter == true) 
       return (TResult)typeConverter.ConvertTo(arg, typeof(TResult)); 
      else 
       return default(TResult); 
     } 

Есть ли способ, чтобы установить общий тип из метода расширения, я имею в виду, вместо того, чтобы позвонить:

string s = "1"; 
s.CastTo<string, int>(); 

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

+0

Что вы пытаетесь достичь? – Steve

+0

Проблема заключается в том, чтобы explicity объявлял тип ввода, я хочу знать, есть ли способ принять его inplicity из класса, который вызывает метод расширения –

+0

Я не уверен, что понимаю, вы имеете в виду, что вам не нужно делать 'string s =" 1 "', или вы хотите получить тип '' '? – Steve

ответ

2

Вы можете ommit тип, когда ваш общий метод ничего не возвращает:

public static void CastTo<T, TResult>(this T arg, out TResult var) 
{ 
    TypeConverter typeConverter = TypeDescriptor.GetConverter(typeof(T)); 
    bool? converter = typeConverter?.CanConvertTo(typeof(TResult)); 
    if (converter != null && converter == true) 
     var = (TResult)typeConverter.ConvertTo(arg, typeof(TResult)); 
    else 
     var = default(TResult); 
} 

И вы используете его так:

string s = "1"; 
int i; 
s.CastTo(out i); 

Это будет знать как тип базы, так и тип вывода, не указывая их явно.

+0

Отлично, это работает для меня. –

+0

@ JosbelLunaRodríguez - Вы знаете, что если вы измените 'typeof (T)' на 'arg.GetType()', чтобы вы могли изменить подпись метода на TResult CastTo (этот объект arg), который был бы гораздо более естественным способом назвать этот метод. Нет никакого смысла указывать «T» как общий параметр, и теперь вы вынуждены использовать параметр out. – Enigmativity

2

Использование Тип объекта:

public static TResult CastTo<TResult>(this object arg) 
    { 
     TypeConverter typeConverter = TypeDescriptor.GetConverter(arg.GetType()); 
     bool? converter = typeConverter.CanConvertTo(typeof(TResult)); 
     if (converter != null && converter == true) 
      return (TResult)typeConverter.ConvertTo(arg, typeof(TResult)); 
     else 
      return default(TResult); 
    } 
+0

Таким образом, работает, но не совсем о методе, является примером, я хочу знать, есть ли способ неспецифического набора типа строки в качестве входного родового типа. Например, мне может потребоваться объявить переменную с типом ввода T, я думаю, что это невозможно. –

+0

@ JosbelLunaRodríguez Я тебя не понимаю. вы говорите: «Установите тип строки как тип входного типа». что это значит? '(эта строка arg)'? или '(это T arg), где T: string'? – Backs

+0

Я могу использовать его как: 'int.CastTo ()' или 'string.CastTo ()' и т. Д. Но когда я это называю, я должен явно описать int или строку соответственно, я не конечно, если есть способ избежать этого, и использовать что-то вроде string.CastTo или 'int.CastTo ()', –

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