2013-03-06 27 views
0

已知類型的泛型參數我有一個接口:出,僅在運行時

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); 
} 

我的問題是我只知道我需要的類型在運行時得到,所以我怎麼樣打電話給我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等爲null,並通過反射調用該方法時,事情默認:調用dImpl.Get(out defaulted)

var method = typeof(Program).GetMethod("Default").MakeGenericMethod(typeof(string)); 
var defaulted = method.Invoke(null, null); 

defaulted將是空的,運行時間不確定使用哪個超載。

所以,我正在尋找的是兩種:一個 )好歹使用當前接口設置[首選] B)用不同的方式來實現目標

回答

2

你可以得到的方法從接口類型,而不是實現類型調用:

object[] parameters = new object[] { null }; 
Type typeParam = typeof(string); 
Type ifaceType = typeof(IOut<>).MakeGenericType(typeParam); 
MethodInfo method = ifaceType.GetMethod("Get"); 

var impl = new Impl(); 
method.Invoke(impl, parameters); 

object outParam = parameters[0]; 
+0

這是偉大的,我沒有想過它會這樣。 – 2013-03-06 13:20:14

+0

''impl' in'method.Invoke(impl,parameters)'從哪裏來? – bflemi3 2013-10-08 19:46:27

+0

@ bflemi3 - 它只是爲了成爲Impl類的一個實例。我已經更新了答案。 – Lee 2013-10-08 20:24:54

0

如果你不知道這樣做直到運行時的output類型,您不能在C#中聲明它的強類型實例。

如果您也可以在T上調用通用邏輯(在您的示例中爲Main),那也可以 - 但這隻會延遲您的問題。

另一種選擇是將output聲明爲基類或接口,並將通用T限制爲此。使用object作爲基類可能適合你 - 取決於你想要用它做什麼。

相關問題