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
答案 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
我已经对其进行了测试,并且对我有用。
顺便说一句,如果您为它传递了一个不可为空的成员,它将返回该属性名称。您可以自己进行测试。