Могу ли я создать универсальный метод, который принимает два разных типа в C # - PullRequest
2 голосов
/ 05 августа 2011

Могу ли я создать универсальный метод, который принимает два типа. attributeType и ts_attributeType не имеют общего родительского класса, хотя имеют одинаковые поля.

Возможно ли это? Или есть какой-то способ, которым я могу достичь этого?

private static void FieldWriter<T>(T row)
        where T : attributeType, ts_attributeType

    {
        Console.Write(((T)row).id + "/" + (((T)row).type ?? "NULL") + "/");
    }

Я видел этот ответ от Джона Скита , однако я не уверен, относится ли он и к моему вопросу.

Некоторые дополнительные сведения: И attributeType, и ts_attributeType были созданы с помощью инструмента xsd.exe; и являются частичными классами.

Ответы [ 3 ]

6 голосов
/ 05 августа 2011

Нет, вы не можете. Самая простая альтернатива - просто написать две перегрузки, по одной для каждого типа. Вы всегда можете извлечь общий код, если хотите избежать повторения:

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") + "/");
}
1 голос
/ 05 августа 2011

Если они являются частичными классами и оба имеют одинаковые свойства, вы можете извлечь эти свойства в интерфейс и использовать их в качестве общего ограничения.

public interface IAttributeType
{
   int id{get;}
   string type{get;set;}
}

Затем создайте частичный класс, соответствующий вашим 2 классам, и просто реализуйте интерфейс:

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") + "/");
}
1 голос
/ 05 августа 2011

Мое текущее решение заключается в создании интерфейса и возможности его реализации частичными классами.Немного назад в логике.

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") + "/");
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...