2013-09-22 32 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