C# 检查对象是否来自泛型类型(无论泛型参数类型如何) 公共类对 { 公共T密钥{get;set;} 公共U值{get;set;} 公共对(T键,U值) { 钥匙=钥匙; 价值=价值; } 公共重写字符串ToString() { if(密钥为Pair) { 返回$“{Key}”,它是{Value}的键; } 返回$“{Key}是{Value}的键”; } }

C# 检查对象是否来自泛型类型(无论泛型参数类型如何) 公共类对 { 公共T密钥{get;set;} 公共U值{get;set;} 公共对(T键,U值) { 钥匙=钥匙; 价值=价值; } 公共重写字符串ToString() { if(密钥为Pair) { 返回$“{Key}”,它是{Value}的键; } 返回$“{Key}是{Value}的键”; } },c#,generics,casting,C#,Generics,Casting,在ToString()中的if语句中,我只想检查Key是否是一对,T和U可以是任何类型 我在这里使用object作为Pair的两个类型参数,但我没有进入if。您可以使用一个反射,检查底层键类型是否为泛型,是否有Pair public重写字符串ToString() { var type=Key.GetType(); 如果(type.IsGenericType&&type.GetGenericTypeDefinition().Equals(typeof(Pair))) { 返回$“{Key}”,它是

在ToString()中的if语句中,我只想检查Key是否是一对,T和U可以是任何类型


我在这里使用object作为Pair的两个类型参数,但我没有进入if。

您可以使用一个反射,检查底层
类型是否为泛型,是否有
Pair

public重写字符串ToString()
{
var type=Key.GetType();
如果(type.IsGenericType&&type.GetGenericTypeDefinition().Equals(typeof(Pair)))
{
返回$“{Key}”,它是{Value}的键;
}
返回$“{Key}是{Value}的键”;
}

Key is Pair
仅在
T
U
具有
object
类型时才起作用,因为在C#类中不支持泛型变体(只有接口和委托才有这种可能性)

您可以在此处使用反射,或者使基类或接口成为非泛型类或接口<代码>对由于通用差异而不起作用
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}";
    }
}