C#试图简化通用类型接口的通用扩展功能

时间:2013-09-22 08:07:16

标签: c# generics extension-methods

以下是代码,最后一行是我正在做的事情的重点:

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>块。可能吗?我应该如何改变我的代码来实现它?谢谢:))

1 个答案:

答案 0 :(得分:4)

我不明白为什么你需要两个通用参数。只需使用一个:

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

然后推理应该可以正常工作:

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

两者之间存在一个轻微的语义差异。如果类型SomeClassstruct,则您的版本不会将参数t包装,而此版本将导致装箱。