2013-01-24 87 views
2

我有以下代碼:鑄造一個通用對象的對象與泛型類型的接口

public class EntityFilter<T> 
{} 

public interface IEntity 
{} 

public class TestEntity : IEntity 
{} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     var ef = new EntityFilter<TestEntity>(); 

     DoSomething((EntityFilter<IEntity>)ef); // <- casting fails 
    } 

    public static void DoSomething(EntityFilter<IEntity> someEntityFilter) 
    { 
    } 
} 

Visual Studio中說:

Cannot convert type 'ConsoleApplication1.EntityFilter<ConsoleApplication1.TestEntity>' to 'ConsoleApplication1.EntityFilter<ConsoleApplication1.IEntity>' 

我不能轉換DoSomething的方法是通用並接受EntityFilter<T>,因爲在我的應用程序中,在DoSomething調用時T的類型是未知的。類型將在稍後使用反射在DoSomething中確定。

如何在不使DoSomething方法爲通用的情況下將ef變量傳遞給DoSomething方法?

+0

爲什麼你能不能創建'ef'作爲'EntityFilter '開始嗎? –

+1

爲什麼不能使你的方法是通用的?這是正確的做法:'方法(EntityFilter ef)其中T:IEntity' – nawfal

+0

你是什麼意思'不起作用'?請提供有關您獲得的錯誤的信息。 – thecoop

回答

3

如果EntityFilter<T>可能來自一個接口,並且該接口有一個協變的泛型參數,那麼您可以在沒有泛型的情況下執行該方法所要求的操作。

請注意IEntityFilter<out T>定義中的「out」關鍵字。

public class Program 
{ 
    static void Main(string[] args) 
    { 
     var ef = new EntityFilter<TestEntity>(); 

     DoSomething(ef); 
    } 

    public static void DoSomething(IEntityFilter<IEntity> someEntityFilter) 
    { 
    } 
} 

public interface IEntityFilter<out T> 
{ } 

public class EntityFilter<T> : IEntityFilter<T> 
{ } 

public interface IEntity 
{ } 

public class TestEntity : IEntity 
{ } 
+0

FYI,通用類型的協方差和反變量在.Net中引入4.0,所以你需要.NET 4.0或更高版本才能工作。 – TylerOhlsen

+0

謝謝,這對我來說似乎是一個很好的解決方案,特別是因爲我的類包含許多其他非泛型方法。所以那個單一的DoSomething通用方法只是「不適合」。我還發現,即使我沒有爲T指定「out」,下面的演員工作正常:var ef =(IEntityFilter )new EntityFilter (); – JustAMartin

+0

...但後來我在投射時得到運行時異常,所以無論如何「真正需要」出來。 – JustAMartin