返回Nullable Type值的泛型方法
本文关键字:泛型方法 Type Nullable 返回 | 更新日期: 2023-09-27 18:20:11
我写了以下方法和以下要求-
- 输入是xmlnode和attributeName
- 如果找到带有传递的关联属性名称的值,则返回该值
-
如果传递的attributeName中没有值,则应返回-
3.1.对于int-13.2.对于Datetime Datetime.MinValue3.3.对于字符串,为空3.4.对于布尔,为空
以下方法在情况3.4中失败。
public T AttributeValue<T>(XmlNode node, string attributeName)
{
var value = new object();
if (node.Attributes[attributeName] != null && !string.IsNullOrEmpty(node.Attributes[attributeName].Value))
{
value = node.Attributes[attributeName].Value;
}
else
{
if (typeof(T) == typeof(int))
value = -1;
else if (typeof(T) == typeof(DateTime))
value = DateTime.MinValue;
else if (typeof(T) == typeof(string))
value = null;
else if (typeof(T) == typeof(bool))
value = null;
}
return (T)Convert.ChangeType(value, typeof(T));
}
当将其更改为时
public System.Nullable<T> AttributeValue<T>(XmlNode node, string attributeName) where T : struct
{
var value = new object();
if (node.Attributes[attributeName] != null && !string.IsNullOrEmpty(node.Attributes[attributeName].Value))
{
value = node.Attributes[attributeName].Value;
}
else
{
if (typeof(T) == typeof(int))
value = -1;
else if (typeof(T) == typeof(DateTime))
value = DateTime.MinValue;
else if (typeof(T) == typeof(string))
return null;
else if (typeof(T) == typeof(bool))
return null;
}
return (T?)Convert.ChangeType(value, typeof(T));
}
字符串类型失败,即情况3.3
期待一些帮助。
3.4需要使用bool?
作为T的类型,因此可以返回null。
然后可以对3.3和3.4使用default
关键字(string和bool?)。根据msdn,它将为引用类型返回null
,并为值类型(如int或bool)返回默认值。
你可以像一样使用它
return default(T);
感谢您的回复,这是我写的,对我有效。
它为类型返回null。
public T AttributeValue<T>(XmlNode node, string attributeName)
{
object value = null;
if (node.Attributes[attributeName] != null && !string.IsNullOrEmpty(node.Attributes[attributeName].Value))
value = node.Attributes[attributeName].Value;
if (typeof(T) == typeof(bool?) && value != null)
value = (string.Compare(value.ToString(), "1", true) == 0).ToString();
var t = typeof(T);
t = Nullable.GetUnderlyingType(t) ?? t;
return (value == null) ?
default(T) : (T)Convert.ChangeType(value, t);
}
我把它叫做
const string auditData = "<mydata><data><equipmentStatiticsData><userStatistics maxUsers='100' totalUsers='1' authUsers='0' pendingUsers='' adminAddedUsers='' xmlUsers='' internalDBUsers='' webUsers='' macUsers='' vpnUsers='' xUsers8021=''></userStatistics><equipmentStatistics cpuUseNow='14' cpuUse5Sec='1' cpuUse10Sec='1' cpuUse20Sec='1' ramTotal='31301632' ramUtilization ='1896448' ramBuffer='774144' ramCached='8269824' permStorageUse='24' tempStorageUse='24'></equipmentStatistics><authStatus status='1'></authStatus></equipmentStatiticsData></data></mydata>";
xmlDoc.LoadXml(auditData);
var userStatsNode = xmlDoc.SelectSingleNode("/mydata/data/equipmentStatiticsData/userStatistics");
var intNullable = AttributeValue<int?>(userStatsNode, "vpnUsers");
var nullableBoolTrue = AttributeValue<bool?>(userStatsNode, "totalUsers");
var nullableBoolFalse = AttributeValue<bool?>(userStatsNode, "authUsers");
var nullableString = AttributeValue<string>(userStatsNode, "authUsers");
var pendingUsersBoolNull = AttributeValue<bool?>(userStatsNode, "pendingUsers");
var testAttribNullableNotFoundDateTime = AttributeValue<DateTime?>(userStatsNode, "testAttrib");
var testAttrib1NullString = AttributeValue<string>(userStatsNode, "testAttrib");
var maxUsersNullInt = AttributeValue<int?>(userStatsNode, "maxUsers");
对我来说效果很好。谢谢大家。。。
您需要使用bool?
而不是bool
来调用第一个代码集,因为null
不是不可为null的bool
的有效值。
第二个代码块失败,因为不能将string
用于Nullable<T>
的泛型类型,因为它需要值类型struct
,而string
是引用类型类。
您需要更改第一个方法块来查找typeof(bool?)
,并使用可为null的布尔类型调用它:
public T AttributeValue<T>(XmlNode node, string attributeName)
{
var value = new object();
if (node.Attributes[attributeName] != null && !string.IsNullOrEmpty(node.Attributes[attributeName].Value))
{
value = node.Attributes[attributeName].Value;
}
else
{
if (typeof(T) == typeof(int))
value = -1;
else if (typeof(T) == typeof(DateTime))
value = DateTime.MinValue;
else if (typeof(T) == typeof(string))
value = null;
else if (typeof(T) == typeof(bool?))
value = null;
}
var type = Nullable.GetUnderlyingType(typeof(T)) ?? typeof(T);
return (T)Convert.ChangeType(value, type);
}
然后称之为:
bool? value = AttributeValue<bool?>(node, "myAttributeName");
您还需要进行检查,因为Convert.ChangeType
不适用于可为null的类型。从这里快速解决这个问题。(包含在上面的代码中)
编辑:这是你的方法的改进/清洁版本:
public T AttributeValue<T>(XmlNode node, string attributeName)
{
if (node.Attributes[attributeName] != null && !string.IsNullOrEmpty(node.Attributes[attributeName].Value))
{
var value = node.Attributes[attributeName].Value;
var type = Nullable.GetUnderlyingType(typeof(T)) ?? typeof(T);
return (T)Convert.ChangeType(value, type);
}
else
{
if (typeof(T) == typeof(int))
return (T)(object)(-1);
return default(T);
}
}
您可以为不存在的节点添加额外的特殊情况,但除了int
之外的所有情况都已经是类型的默认值,所以只需使用default(T)
即可。