У меня есть интерфейс:Out общие параметры с типами известны только во время выполнения
public interface IOut<T>
{
void Get(out T output);
}
и класс, который реализует это:
public class Impl : IOut<string>, IOut<int>{
public void Get(out string output) { output = "string"; }
public void Get(out int output) { output = 12; }
}
я могу сделать очень хорошо следующее:
public static void Main()
{
dynamic dImpl = new Impl();
string sOutput;
int iOutput;
dImpl.Get(out sOutput);
dImpl.Get(out iOutput);
Console.WriteLine(sOutput);
Console.WriteLine(iOutput);
}
Моя проблема в том, что я знаю только тип, который мне нужен, чтобы получил во время выполнения, так как I хотят назвать мой Get
код следующим образом:
public static void Main()
{
dynamic dImpl = new Impl();
var t = typeof(string);
t output;
dImpl.Get(out output);
Console.WriteLine(output);
}
Теперь я знаю, что это не будет работать, и я попытался рефлекторно выполняя В ролях:
public static T Cast<T>(object o) { return (T) o; }
но я у меня нет объекта для броска, у меня есть только Type
. Я пробовал по умолчанию:
public static T Default<T>() { return default(T); }
но по умолчанию для таких вещей, как string
и т.д. имеет нулевое значение, и при вызове метода с помощью отражения:
var method = typeof(Program).GetMethod("Default").MakeGenericMethod(typeof(string));
var defaulted = method.Invoke(null, null);
defaulted
собирается быть пустым, и при вызове dImpl.Get(out defaulted)
среда выполнения не уверен в том, какую перегрузку использовать.
Итак, что я ищу либо: а) каким-то образом сделать это, используя текущую настройку интерфейса [предпочтительная] б) другой способ достижения целей
Это здорово, я бы не думал о том, на это таким образом. –
, где происходит 'impl' в' method.Invoke (impl, parameters) '? – bflemi3
@ bflemi3 - Это просто экземпляр класса «Impl». Я обновил ответ. – Lee