2013-09-22 34 views
1

下面是代碼,最後一行是我在做什麼亮點:C#試圖簡化通用擴展功能的通用類型的接口

public interface IHasContext<TContext> { 
    TContext Context {get; set;} 
} 
public static class Extensions { 
    public static void ProcessContext<THasContext, TContext>(this THasContext t) 
    where THasContext : IHasContext<TContext> 
    where TContext : class { 
     //... 
    } 
} 
public class SomeClassContext {/*...*/} 
public class SomeClass : IHasContext<SomeClassContext> { 
    public SomeClassContext Context {get; set;} 
    //... 
} 

//now in a function I can do: 
    objSomeClass.ProcessContext<SomeClass, SomeClassContext>(); 

你看,因爲SomeClass已經知道它包含<SomeClassContext>,所以我想做:

objSomeClass.ProcessContext(); 

沒有<SomeClass, SomeClassContext>塊。可能嗎?我應該如何改變我的代碼來實現它?謝謝:)

回答

4

我不明白你爲什麼需要兩個通用參數。只需使用一個:

public static class Extensions { 
    public static void ProcessContext<TContext>(this IHasContext<TContext> t) 
    where TContext : class { 
    //... 
    } 
} 

然後推斷應該只是罰款:

var obj = new SomeClass(); 
obj.ProcessContext(); 

還有就是兩者之間的一個細微的語義差別。如果SomeClass類型是struct,那麼您的版本不會將參數t框起來,而此版本將導致裝箱。

+0

哦!謝謝!我無法將這個想法包裹起來。謝謝你的幫助! – Tom