为了检查a Type(propertyType)是否可以为空,我正在使用:
bool isNullable = "Nullable`1".Equals(propertyType.Name)
Run Code Online (Sandbox Code Playgroud)
有没有办法避免使用魔法字符串?
其中一个:"是否有一种更简单的内置处理方式而不是我的帮助方法?"
所以从可空类型中获取底层类型很容易,但是如何获得.NET类型的可空版本呢?
所以我有
typeof(int)
typeof(DateTime)
System.Type t = something;
Run Code Online (Sandbox Code Playgroud)
而且我要
int?
DateTime?
Run Code Online (Sandbox Code Playgroud)
要么
Nullable<int> (which is the same)
if (t is primitive) then Nullable<T> else just T
Run Code Online (Sandbox Code Playgroud)
有内置方法吗?
可能重复:
Nullable类型不是可空类型?
在以下代码中:
DateTime? dt = DateTime.Now;
MessageBox.Show(dt.GetType().ToString());
Run Code Online (Sandbox Code Playgroud)
消息框显示"System.DateTime",而不是Nullable<DateTime>.以下内容也返回false(因为GetType错误):
if (dt.GetType().IsAssignableFrom(typeof(DateTime?)))
...
Run Code Online (Sandbox Code Playgroud)
(顺便说一句,使用DateTime?或Nullable<DateTime>没有区别)在监视窗口中,您有"类型"列显示正确的类型(System.DateTime?).
在我的代码中,我引用了dt作为一个object,所以我需要正确地获取底层类型.我怎样才能做到这一点?
我有一个定义如下的方法:
public bool IsValid(string propertyName, object propertyValue)
{
bool isValid = true;
// Validate property based on type here
return isValid;
}
Run Code Online (Sandbox Code Playgroud)
我想做的事情如下:
if (propertyValue is bool?)
{
// Ensure that the property is true
}
Run Code Online (Sandbox Code Playgroud)
我的挑战是,我不知道如何检测我的propertyValue是否是可以为空的bool.谁能告诉我怎么做?
谢谢!
这是我用来检测我们是否正在处理Nullable类型的条件:
System.Nullable.GetUnderlyingType(itemType) != null
Run Code Online (Sandbox Code Playgroud)
这里是我队友的代码:
itemType.IsGenericType && itemType.GetGenericTypeDefinition() == typeof(Nullable<>)
Run Code Online (Sandbox Code Playgroud)
我们实际上并没有找到一个案例,其中一个将返回true而另一个false(或反之亦然),但这两个片段是否完全相同?
有一个有趣的奇怪 - 认为有人可能会帮助.
这可以从这个问题的可空类型中获得一些乐趣:
Option Strict On
Module Test
' Call this overload 1
<Extension()>
Function IsNullable(obj As ValueType) As Boolean
Return False
End Function
' Call this overload 2
<Extension()>
Function IsNullable(Of T As {Structure})(obj As Nullable(Of T)) As Boolean
Return True
End Function
Sub Test()
' a is an integer!
Dim a As Integer = 123
' calling IsNullable as an extension method calls overload 1 and returns false
Dim result1 As Boolean = a.IsNullable()
' calling …Run Code Online (Sandbox Code Playgroud) 我有一些带有某些属性的类,我想将值从字符串转换为此属性的类型。而且我有转换为可为空类型的问题。这是我的转换方法:
public static object ChangeType(object value, Type type)
{
if (type.IsGenericType && type.GetGenericTypeDefinition().Equals(typeof(Nullable<>)))
{
if (value == null)
{
return null;
}
var underlyingType = Nullable.GetUnderlyingType(type);
var val = Convert.ChangeType(value, underlyingType);
var nullableVal = Convert.ChangeType(val, type); // <-- Exception here
return nullableVal;
}
return Convert.ChangeType(value, type);
}
Run Code Online (Sandbox Code Playgroud)
我收到这样的异常(对于int类型的属性?):
从'System.Int32'到'System.Nullable`1 [[System.Int32,mscorlib,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089]]的无效转换。
如何从类型转换为可为空的类型?谢谢。
反正知道这个吗?
我找到一篇帖子,询问一个非常类似的问题, 如何检查一个对象是否可以为空? 答案解释了如果可以访问通用类型参数,如何确定对象是否可为空.这是通过使用来完成的Nullabe.GetUnderlyingType(typeof(T)).但是,如果您只有一个对象并且它不为null,您能否确定它是否实际上是Nullable ValueType?
换句话说,有没有比单独检查每个可能的可空值类型更好的方法来确定盒装结构是否是值类型?
void Main(){
Console.WriteLine(Code.IsNullableStruct(Code.BoxedNullable));
}
public static class Code{
private static readonly int? _nullableInteger = 43;
public static bool IsNullableStruct(object obj){
if(obj == null) throw new ArgumentNullException("obj");
if(!obj.GetType().IsValueType) return false;
return IsNullablePrimitive(obj);
}
public static bool IsNullablePrimitive(object obj){
return obj is byte? || obj is sbyte? || obj is short? || obj is ushort? || obj is int? || obj is uint? || obj is long? || obj is ulong? || …Run Code Online (Sandbox Code Playgroud) 如果有以下方法:
static void DoSomethingWithTwoNullables(Nullable<int> a, Nullable<int> b)
{
Console.WriteLine("Param a is Nullable<int>: " + (a is Nullable<int>));
Console.WriteLine("Param a is int : " + (a is int));
Console.WriteLine("Param b is Nullable<int>: " + (b is Nullable<int>));
Console.WriteLine("Param b is int : " + (b is int));
}
Run Code Online (Sandbox Code Playgroud)
当我使用null作为参数调用此方法时,类型检查将为此参数返回false.例如这段代码
DoSomethingWithTwoNullables(5, new Nullable<int>());
Run Code Online (Sandbox Code Playgroud)
结果输出:
Param a is Nullable<int>: True
Param a is int : True
Param b is Nullable<int>: False
Param b is int : False
Run Code Online (Sandbox Code Playgroud)
有没有办法在使用Nullable并传递null时保留类型信息?我知道在这个例子中检查类型是没用的,但它说明了问题.在我的项目中,我将参数传递给另一个接受params object[]数组的方法,并尝试识别对象的类型.这个方法需要为Nullable<int>和做不同的事情 …
如何正确识别给定类型的变量(或类成员)是否可以采用null?更具体地说,如何处理,Nullable<T>因为它不是参考类型?或者可能在其上定义一些怪异隐式转换的任何其他类型.我的直觉是找到答案的唯一可靠方法是try{} catch{}看它是否爆炸......但也许有一些技巧.
c# ×10
.net ×6
nullable ×6
c#-4.0 ×2
reflection ×2
.net-2.0 ×1
.net-4.0 ×1
generics ×1
overloading ×1
value-type ×1
vb.net ×1