从可为空的变量中获取类型

时间:2018-08-10 16:28:52

标签: c# asp.net types nullable

public class MyType
{
    public int? MyId { get; set; }    
}

MyType myType = new MyType();
myType.MyId.GetType()

最后一行返回异常,因为未设置MyId(即,它为null)。在这种情况下,如何获取类型(int?甚至int)?请注意,以int?为例,该变量可以具有任何类型,这只是一个简化的示例。

请注意,根据Microsoft的说法,这应该可行:

int? a = 17;
Type typeOfA = a.GetType();
Console.WriteLine(typeOfA.FullName);
// Output:
// System.Int32

,并且在分配值时确实有效...

编辑。

查看一些答复和评论,我想在代码中添加它,我将myType.MyId作为对象传递给需要确定其类型的方法。基本上看起来类似于:

public void RunQuery(string sql, List<(string parameterName, object parameterValue)> parameters)

所以myType.MyId作为parameterValue传递到RunQuery

2 个答案:

答案 0 :(得分:5)

您可以使用反射来获取属性的声明类型(在编译时已知):

async

并且override用于在运行时确定对象的实际类型,但这对于foo引用来说没有意义。

编辑:

B强制转换为Task<int>时,其值将被装箱,因此,如果它是Type t = typeof(MyType).GetProperty(nameof(MyType.MyId)).PropertyType; ,则您将只得到{{1 }}参考,您将无法再找到类型。

因此,您应该以某种方式更改基础结构,以使类型随参数传递。最快的解决方法是显式传递

GetType()

不确定System.Data.SqlClient.SqlParameter,但这可能正是您需要使用的。

答案 1 :(得分:2)

[已编辑],我重新编写了解决方案,以解决您的问题:制作与MyType无关的函数:

string GetPropertyName<T>(T prop)
{
    var type = typeof(T);
    if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>))
    {
        return type.GenericTypeArguments[0].FullName;
    }
    else
    {
        return type.FullName;
    }
}

您现在可以这样称呼它:

MyType myType = new MyType();
string name = GetPropertyName(myType.MyId);
Console.WriteLine(name);  // Outputs System.Int32

我已经对其进行了测试,并且对我有用。

顺便说一句,如果您为它传递了一个不可为空的成员,它将返回该属性名称。您可以自己进行测试。