泛型背后的整个想法是拥有泛型代码,因此该类的类型可以被视为相同。从您发布的内容中,很难看出您拥有哪些通用代码。
下面我有一个包含一些通用代码的类:
class Mangler<TInput, TOutput>
where TInput: ITInput
where TOutput: ITOutput {
public TInput Input { get; set; }
public TOutput Output { get; set; }
public bool IsInputAGuid() {
if (Guid.Parse(this.Input.SomeThing) == this.Output.SomeGuid ) {
return true;
}
return false;
}
}
你可以在上面的类中看到,当它把一个字符串从this.Input.Something解析成Guid,然后用this.Ouput.SomeGuid对它执行==,编译器很高兴,因为我们已经做出了约束: TInput 必须实现接口 ITInput 以便编译器知道该行将起作用并且Input 将具有Something 作为string 属性:
Guid.Parse(this.Input.SomeThing)
只要Something 可用,编译器就不会关心具体类型是什么。 TOuput 的想法相同,但编译器希望它实现 ITOutput,因此它希望 SomeGuid 中的 Guid。这就是为什么编译器乐于将字符串解析为 guid,然后对其执行 == 操作符,而另一件事也是 Guid。
以下是接口和一些实现它们的类:
internal interface ITInput {
string SomeThing { get; set; }
}
internal interface ITOutput {
Guid SomeGuid { get; set; }
}
internal class AnotherInput : ITInput {
public string SomeThing { get; set; }
}
internal class SomeInput : ITInput {
public string SomeThing { get; set; }
}
internal class SomeOutput : ITOutput {
public Guid SomeGuid { get; set; }
}
internal class SomeOtherOutput : ITOutput {
public Guid SomeGuid { get; set; }
}
最后,这里是我们可以通用处理这些的用法:
var manglers = new List<Mangler<ITInput, ITOutput>>();
manglers.Add( new Mangler<ITInput, ITOutput>
{ Input = new SomeInput(), Output = new SomeOutput() } );
manglers.Add( new Mangler<ITInput, ITOutput>
{ Input = new AnotherInput(), Output = new SomeOutput() } );
foreach( var thisMangler in manglers ) {
var input = thisMangler.Input;
var output = thisMangler.Output;
var success = thisMangler.IsInputAGuid();
}
您可以在foreach 中看到,无论具体类型如何,我们都可以调用Input、Output 和IsInputAGuid()。
所以在你的代码中找到什么代码是通用的,然后将上面的技术应用到它上面。您可以为约束使用接口或基类。