我可以在c#中创建一个接受两种不同类型的泛型方法吗?
本文关键字:两种 同类型 泛型方法 一个 创建 我可以 | 更新日期: 2023-09-27 18:04:31
我可以创建一个接受两种类型的泛型方法吗?attributeType
和ts_attributeType
不共享任何共同的父类,尽管它们有相同的字段。
这可能吗?或者我有什么办法可以做到这一点?
private static void FieldWriter<T>(T row)
where T : attributeType, ts_attributeType
{
Console.Write(((T)row).id + "/" + (((T)row).type ?? "NULL") + "/");
}
我从Jon Skeet那里看到了这个答案,但是我不确定它是否也适用于我的问题。
进一步的背景:attributeType
和ts_attributeType
已经通过xsd.exe工具创建完成;它们都是分部类。
不行。最简单的替代方法是简单地编写两个重载,每种类型一个。如果你想避免过多的重复,你总是可以提取公共代码:
private static void FieldWriter(attributeType row)
{
FieldWriterImpl(row.id, row.type);
}
private static void FieldWriter(ts_attributeType row)
{
FieldWriterImpl(row.id, row.type);
}
// Adjust parameter types appropriately
private static void FieldWriterImpl(int id, string type)
{
Console.Write(id + "/" + (type ?? "NULL") + "/");
}
或者,如果使用c# 4, 可以使用动态类型。
(一个更好的解决方案是,如果可能的话,给这两个类一个共同的接口——并同时重命名它们以遵循。net命名约定:)
编辑:现在我们已经看到你可以使用分部类,你不需要它是泛型的:
private static void FieldWriter(IAttributeRow row)
{
Console.Write(row.id + "/" + (row.type ?? "NULL") + "/");
}
如果它们是部分类,并且都具有相同的属性,您可以将这些属性提取到接口中并将其用作通用约束。
public interface IAttributeType
{
int id{get;}
string type{get;set;}
}
然后创建一个匹配你的两个类的部分类,并简单地实现接口:
public partial class AttributeType : IAttributeType
{
// no need to do anything here, as long as AttributeType has id and type
}
public partial class ts_AttributeType : IAttributeType
{
// no need to do anything here, as long as ts_AttributeType has idand type
}
现在你可以通过接口约束泛型:
private static void FieldWriter<T>(T row)
where T : IAttributeType
{
Console.Write(row.id + "/" + (row.type ?? "NULL") + "/");
}
我目前的解决方案是创建一个接口,并让部分类实现它。逻辑上有点倒退
namespace Test
{
public partial class attributeType: IAttributeRow {}
public partial class ts_attributeType : IAttributeRow {}
public interface ICommonFields
{
string id { get; set; }
string type { get; set; }
}
}
private static void FieldInfo<T>(T row)
where T : IAttributeRow
{
Console.Write(((T)row).id + "/" + (((T)row).type ?? "NULL") + "/");
}