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

use*_*754 2 c# asp.net types nullable

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

MyType myType = new MyType();
myType.MyId.GetType()
Run Code Online (Sandbox Code Playgroud)

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

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

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

它确实在分配值时起作用...

编辑。

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

public void RunQuery(string sql, List<(string parameterName, object parameterValue)> parameters)
Run Code Online (Sandbox Code Playgroud)

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

Bag*_*ich 5

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

Type t = typeof(MyType).GetProperty(nameof(MyType.MyId)).PropertyType;
Run Code Online (Sandbox Code Playgroud)

GetType()用于找出实际的类型在运行时的对象,但这并不针对意义null的参考。

编辑:

当你施放Nullable<T>一个Object,它的价值是盒装,所以,如果是null,你会得到只是一个Object可变null的参考,你将无法找出任何类型更多。

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

List<(string parameterName, object parameterValue, Type parameterType)> parameters
Run Code Online (Sandbox Code Playgroud)

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