C# 是否可以通用地实现此接口,以便只传递一个类型参数?

C# 是否可以通用地实现此接口,以便只传递一个类型参数?,c#,.net,generics,.net-3.5,C#,.net,Generics,.net 3.5,我有一个名为identificatable的接口,它包含给定类型的单个属性Id。我想创建一个泛型类,将其中一个作为类型参数。它应该是泛型的,因为我想返回具体的类型,从中调用其他泛型方法,并使用typeof(T)之类的东西 这很好: public class ClassName<T, TId> where T : Identifiable<TId> 公共类类名,其中T:可识别 问题是调用代码必须传入两种类型。例如,newclassname() 我想知道在.NET3.5中

我有一个名为
identificatable
的接口,它包含给定类型的单个属性Id。我想创建一个泛型类,将其中一个作为类型参数。它应该是泛型的,因为我想返回具体的类型,从中调用其他泛型方法,并使用
typeof(T)
之类的东西

这很好:

public class ClassName<T, TId> where T : Identifiable<TId>
公共类类名,其中T:可识别
问题是调用代码必须传入两种类型。例如,
newclassname()


我想知道在.NET3.5中是否有某种方法可以编写此代码,以便通过T推断TId?允许调用方只执行
new ClassName()

否。您需要为
可识别的
提供一个类型参数;如果不在类声明中声明参数,您如何做到这一点:

public class ClassName<T> where T : Identifiable<?WhatDoWePutHere?> 
公共类类名,其中T:可识别

AFAIK,使用
where
子句是不可能的。您可能希望使用代码契约(例如在.NET4中)并添加

合同要求(T是可识别的);

到您的代码。我不知道是否有任何方法可以在.NET3.5中实现这一点

从您问题的性质来看,我猜您的类名不依赖于任何需要TId的方法(否则您将需要该类型)。如果是这样,在这种情况下,一个常见的解决方案是创建一个非泛型基接口,其中包含所有不需要TId类型的方法。那么你有:

interface Identifiable<TId> : Identifiable //Not a standard interface name, btw
接口可识别:可识别//不是标准接口名称,顺便说一句
你的约束变成:

public class ClassName<T> where T : Identifiable
公共类类名,其中T:可识别

假设您确实需要TId类型,但只是希望简化构造语法,如果您的构造函数正在获取可识别的实例(例如示例中的人),一个选项是将构造函数更改为工厂方法:

public static ClassName<T, TId> FromIdentifiable<T,TId>(T identifiable) where T: Identifiable<TId>
public静态类名fromIdentification(T-Identification),其中T:Identification

以上内容应允许编译器根据参数的类型推断类型,并为您提供较短的语法。

如果您的类的大多数使用形式为
ClassName
,其中T类型(Person)在大多数情况下都会发生变化,但TId类型几乎总是
int
,您可以提供一个部分解析的类,该类提供TId类型,但不绑定T类型。这样做的主要缺点是,您将有多个必须具有不同名称的类

public class BaseClassName<T, TId> where T: Identifiable<TId> 
{ }

public class ClassName<T> : ClassName<T, int> 
{ }

var x = new ClassName<Person>();
公共类基类名称,其中T:可识别
{ }
公共类ClassName:ClassName
{ }
var x=新的类名();
对于不希望int作为TId的不太常见的情况,arity 2类仍然可用:

var y = new BaseClassName<Person, int>()
var y=new BaseClassName()

也许您可以展示一个稍微详细一点的示例,这样就可以清楚地知道您要做什么以及为什么要这样做。
var y = new BaseClassName<Person, int>()