2014-11-21 3 views
0

может я что-то вроде:Может ли C# вернуть тип в методе?

AMess.Foo = MessyData.GetData<MessyData.GetType(key)>(key); 

?

моя проблема похожа на мой пример. У меня есть источник данных, который динамически типизирован, поэтому я должен что-то сделать, чтобы определить тип данных. но это боль в заднице, чтобы повесить проверку типа. поэтому я думаю, может быть, у меня может быть какой-то код, чтобы сказать мне, какой он тип. я могу сделать это?

или, может быть, лучшее решение?

не беспокойтесь о AMess.Foo, он ест все.

+2

Если он что-то ест, почему бы не вернуть объект, а не нужна ли общая подпись? –

ответ

2

Нет, это невозможно. Вместо этого вам придется использовать Reflection. Я не установлен Visual Studio на моей машине в данный момент, так что я не могу проверить синтаксис в данный момент, но это должно быть близко:

var type = MessyData.GetType(key); 
var castMethod = MessyData.GetType().GetMethod("GetData").MakeGenericMethod(type); 
AMess.Foo = castMethod.Invoke(MessyData, new[] { key }); 
+0

Как насчет возврата значения 'typeof (T)'? –

+0

Это все еще возвращает экземпляр 'Type' и не может использоваться в Generics with Reflection. –

1

No. аргументы родового типа должны быть решены на compile- время.

Если вы используете:

MessyData.GetData<SomeType>(key); 

затем SomeType должно быть имя конкретного класса (или интерфейса, структуры и т.д.). Это никогда не может быть выражение как в вашем вопросе.

Если вы позволяете типа можно сделать вывод, как в:

MessyData.GetData(key); // infer type arg 

то тип, используемый при вызове типа во время компиляции переменной key, не типа во время выполнения. Эти типы могут различаться.

Если вам действительно нужна динамическая типизация, вы можете получить GetData параметр с параметром dynamic (метод будет носить не общий характер). Но в чем проблема, которую вы пытаетесь решить?

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