C# 尝试简化泛型类型化接口的泛型扩展函数
本文关键字:泛型 类型化 接口 函数 扩展 泛型类型 泛型类 | 更新日期: 2023-09-27 18:32:28
这是代码,最后一行是我正在做的事情的亮点:
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>
块。可能吗?我应该如何更改我的代码来实现它?谢谢:)
我不明白为什么你需要两个通用参数。只需使用一个:
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
,而此版本将导致装箱。