C#通用类型比较

时间:2018-05-30 13:15:03

标签: c# generics

我有这段代码:

public class myList<T> where T : struct
{
    public int number { get; set; }
}

public class TypeTest
{
    public static int GetNumber(object x)
    {
        //  if (x.GetType() == typeof(myList<>)) // this works BUT I want to use is
        if (x is myList<>) // how is the correct syntax for this?
        {
            int result = ((myList<>)x).numb; //does not compile
            return result;
        }
        return 0;
    }
}

但是一些通用的语法问题。

问题:这是什么语法?

2 个答案:

答案 0 :(得分:4)

将您的方法重新声明为通用方法会很好:

public static T GetNumber<T>(myList<T> myList) where T : struct

这样做可以避免任何演员阵容,并且该方法的身体将变为单线,如下所示:

return myList?.numb ?? 0;

答案 1 :(得分:3)

您可以按照Testing if object is of generic type in C#中的说明检查对象是否属于您的开放泛型类型,然后获取名为&#34; number&#34;从实际类型:

var typeOfX = x.GetType();
if (typeOfX.GetGenericTypeDefinition() == typeof(myList<>))
{
    var numberProperty = typeOfX.GetProperty("number");

    var propertyValue = numberProperty.GetValue(x);

    return (int)propertyValue;
}

请注意,此代码缺少任何错误处理,例如缺少属性或不属于预期类型的​​属性。这是因为被迫使用反思而付出的代价。