Ada*_*ler 5 .net c# generics .net-3.5
我有一个名为的接口Identifiable<TId>,它包含给定类型的单个属性Id.我想创建一个泛型类,将其中一个作为类型参数.它应该是通用的,因为我想返回具体类型,从其中调用其他泛型方法并使用类似的东西typeof(T).
这很好用:
public class ClassName<T, TId> where T : Identifiable<TId>
Run Code Online (Sandbox Code Playgroud)
问题是调用代码必须传递两种类型.例如.new ClassName<Person, int>()
我想知道是否在.net 3.5中有一些方法可以写这个,以便TI可以推断TI?允许来电者做new ClassName<Person>()什么?
从你的问题的性质来看,我猜测你的 ClassName 不依赖于 Identifying 中需要 TId 的任何方法(否则你将需要该类型。)如果是这种情况,在这种情况下,一个常见的解决方案是创建一个非通用基接口,具有不需要 TId 类型的所有方法。那么你有:
interface Identifiable<TId> : Identifiable //Not a standard interface name, btw
Run Code Online (Sandbox Code Playgroud)
你的约束变成:
public class ClassName<T> where T : Identifiable
Run Code Online (Sandbox Code Playgroud)
假设您确实需要 TId 类型,但只是想简化构造语法,如果您的构造函数采用 Identificate 的实例(例如示例中的 Person),一种选择是将构造函数更改为工厂方法:
public static ClassName<T, TId> FromIdentifiable<T,TId>(T identifiable) where T: Identifiable<TId>
Run Code Online (Sandbox Code Playgroud)
上面的内容应该允许编译器根据参数的类型推断类型并为您提供更短的语法。