我可以在c#中创建一个接受两种不同类型的泛型方法吗?

本文关键字:两种 同类型 泛型方法 一个 创建 我可以 | 更新日期: 2023-09-27 18:04:31

我可以创建一个接受两种类型的泛型方法吗?attributeTypets_attributeType不共享任何共同的父类,尽管它们有相同的字段。

这可能吗?或者我有什么办法可以做到这一点?

private static void FieldWriter<T>(T row)
        where T : attributeType, ts_attributeType
    {
        Console.Write(((T)row).id + "/" + (((T)row).type ?? "NULL") + "/");
    }

我从Jon Skeet那里看到了这个答案,但是我不确定它是否也适用于我的问题。

进一步的背景:attributeTypets_attributeType已经通过xsd.exe工具创建完成;它们都是分部类。

我可以在c#中创建一个接受两种不同类型的泛型方法吗?

不行。最简单的替代方法是简单地编写两个重载,每种类型一个。如果你想避免过多的重复,你总是可以提取公共代码:

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") + "/");
    }