Проверить, принадлежит ли объект к общему типу c (независимо от типов параметров c) - PullRequest
0 голосов
/ 03 августа 2020
public class Pair<T, U>
{
    public T Key { get; set; }
    public U Value { get; set; }

    public Pair(T key, U value)
    {
        Key = key;
        Value = value;
    }

    public override string ToString()
    {
        if (Key is Pair<object, object>)
        {
            return $"{Key} which is the key to {Value}";
        }
        return $"{Key} is the key to {Value}";
    }
}

В операторе if внутри ToString () я хочу просто проверить, является ли Key парой или нет, T и U могут быть любого типа.

Я использовал здесь объект как оба параметры типа Pair, но я не попадаю внутрь if.

1 Ответ

1 голос
/ 03 августа 2020

Вы можете использовать для этого отражение и проверить, что базовый тип Key является generi c и имеет Pair<,> generi c определение

public override string ToString()
{
    var type = Key.GetType();
    if (type.IsGenericType && type.GetGenericTypeDefinition().Equals(typeof(Pair<,>)))
    {
        return $"{Key} which is the key to {Value}";
    }
    return $"{Key} is the key to {Value}";
}

Key is Pair<object, object> будет работать только тогда, когда T и U имеют тип object, потому что в C# классах не поддерживается общая c дисперсия (такая возможность есть только у интерфейсов и делегатов)

...