数据字段<;T>;以及DataField<;T>;
本文关键字:gt lt DataField 以及 数据 字段 | 更新日期: 2023-09-27 18:21:37
有什么方法可以工作吗?当然,以下代码不起作用::-)
有多种类型的数据字段:int, string, DateTime, double, MyOwnType
DataFields本身被封装到一个泛型类中,并且它们的类型是T类型。所有的T都是值类型,可以为null,不过(int?, DateTime?, double?
)。这是为了存储我们数据库的原因。如果值为null,我们不会在数据库中为该数据字段创建新记录。
public void SetDataFieldValue<T>(string fieldName, T value)
{
DataField<T>.Value = (T)(object)value;
}
这与可为null的T非常吻合。但如果我们称之为
SetDataFieldValue<int>("NumberOfChildren", value)
它不会工作,因为DataField<int>
不存在。所以我需要这样的东西(我们只需要空输入):
public void SetDataFieldValue<T>(string fieldName, T value)
{
var defaultValue = default(T);
if (defaultValue.GetType().IsValueType)
{
// This T? just works with value types.
// Of I set a constraint where T: struct this would work.
// So the if statement above is not enough to tell the compiler,
// that in here only value types of T are handled
DataField<T?>.Value = // whatever
}
if (defaultValue.GetType().IsReferenceType)
{
DataField<T>.Value = // whatever
}
}
因此,如果使用int?
调用它,则确定如果值为null,则不希望存储该值。如果你用int
调用它,它将用0
存储(创建一个记录)。
请不要建议更改数据字段的设计。如果值为null,则不创建新DB记录的一个原因是null已被定义为"无信息"(null家族的子代不是有意设置的字段)。"0"是信息(0子项)。
更新
对不起。我忘了提一下我们也有public T GetDataFieldValue<T>(string fieldName)
。在这里,我们不能仅仅确定值的类型。
数据字段的定义表明,如果我们的数据字段可以为null,那么它的值也应该为null。这也适用于不可为null(实际上不存在)的数据字段。
所以如果我们说GetDataField<int>
,我们想返回(int)DataField<int?>.Value
但是如果值是null
,我们就不能用(int)
来强制转换它。所以我们这样做:
(T为int
)
if (DataField<int?>.Value == null)
{
return default(T);
}
return (int)DataField<int?>.Value
目前我看到的唯一方法是,如果我们想返回一个不可为null的整数,我们可以像GetFieldValue<int?, int>(name)
一样调用这个方法。否则,我们调用GetFieldValue<int?, int?>
来获取一个可为null的整数。
显然没有办法创建带有约束的重载?那么第一种方法有where T: struct
和过载where T: class
?
为什么不直接用Nullable<Int>
来调用它呢?
SetDataFieldValue<Nullable<int>>("NumberOfChildren", value)
编辑:
GetDataFieldValue<T>(string fieldName)
也可以用Nullable调用。要获得T的值,请使用typeof(T)
:
public T GetFieldValue<T>(string fieldName) {
var theTypeOfT = typeof(T);
}
// Call this using Nullable<T>:
var someNullableInt = GetFieldValue<Nullable<T>>("foo");