C#试图简化泛型接口的泛型扩展函数

C#试图简化泛型接口的泛型扩展函数,c#,generics,extension-methods,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 : IHasCont

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

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

没有
块。可能吗?我应该如何修改代码来实现它?谢谢:)

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

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

这两者之间有一个细微的语义差异。如果类型
SomeClass
是一个
struct
,那么您的版本将不会装箱参数
t
,而此版本将导致装箱。

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

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

这两者之间有一个细微的语义差异。如果类型
SomeClass
是一个
struct
,那么您的版本将不会装箱参数
t
,而此版本将导致装箱。

Oh!谢谢我无法接受这个想法。谢谢你的帮助!哦谢谢我无法接受这个想法。谢谢你的帮助!
var obj = new SomeClass();
obj.ProcessContext();