【问题标题】:c#: IsNullableType helper class?c#: IsNullableType 辅助类?
【发布时间】:2010-03-08 11:32:20
【问题描述】:

谁能帮忙?

我有一些代码在 2 个项目之间共享。代码指向一个模型,该模型基本上是来自数据库的属性集合。

问题是某些属性在 1 个模型中使用可为空的类型,而另一些则没有

确实 dbs 应该使用相同的,但他们没有..

例如,有一个名为 IsAvailble 的属性在一个模型中使用“bool”,而另一个使用 bool? (可空类型)

所以在我的代码中我执行以下操作

 objContract.IsAvailble.Value ? "Yes" : "No"   //notice the property .VALUE as its a bool? (nullable type)

但在使用标准“bool”(不可为空)的模型上,此行将失败,因为不可为空的类型没有属性 .VALUE

是否有某种帮助类可以检查属性是否为可空类型,我可以返回 .Value .. 否则我只返回属性。

有人有解决办法吗?

编辑

这就是我现在所拥有的.....我正在检查可空类型版本中的 HasValue

公共静态类 NullableExtensions { public static T GetValue(this T obj) where T : struct { 返回对象; } public static T GetValue(this Nullable obj) where T : struct { 返回对象值; }

    public static T GetValue<T>(this T obj, T defaultValue) where T : struct
    {
        return obj;
    }

    public static T GetValue<T>(this Nullable<T> obj, T defaultValue) where T : struct
    {
        if (obj.HasValue)
            return obj.Value;
        else
            return defaultValue;
    }
}

【问题讨论】:

  • 你拿到的合同不是很好...
  • 感谢大家的 cmets,但布尔值?只是一个例子。我还有许多不同的类型可以为空或不可以为空,即 int、int?、DateTime、DateTime? ....我希望一些通用的东西
  • 嗨,kobi,是的,我知道它并不理想....但是我现在必须使用它的代码......将来我会改变它
  • 知道事实上,可空版本实际上是有值的吗?
  • 嗨 Kobi,代码是使用实体框架和 T4 从数据库自动创建的模型..每个数据库中的模型“应该”相同,但它的“不”.. . 非常糟糕......我试图改进它.. 它不是我的代码......但我有改进它的工作......

标签: c#


【解决方案1】:

这有点奇怪,但也许你可以在这里使用扩展方法:

static class NullableExtensions
{
    public static T GetValue<T>(this T obj) where T : struct
    {
        return obj;
    }
    public static T GetValue<T>(this Nullable<T> obj) where T : struct
    {
        return obj.Value;
    }
}

它们将适用于可为空或常规类型:

int? i = 4;
int j = 5;

int a = i.GetValue();
int b = j.GetValue();

【讨论】:

  • +1 出于灵活性考虑,因为如上所述,bool 可能不是唯一的类型。
  • 如果“i”为空,“i.GetValue()”将失败。但是你可以将方法体修改为“return obj == null ? default(T) : obj.Value;”
  • @Hans - 会的。您需要检查空值(尽管这对 OP 来说是有问题的),或者返回 default(T)。这里没有魔法。在这种情况下,也许你想要一个例外?无论如何,这是很重要的一点。我看到有人已经问过 OP。
  • 您可能希望在签名中添加一个附加参数,以便在以下情况下返回值:a) 它是可空的,并且 b) 它实际上是空的。例如(这个 T obj,T 默认)。普通结构版本将忽略此参数。
  • @Damien - 好主意。同样,我不介意空检查,因为问题没有提到,但这是一个很好的解决方案。
【解决方案2】:

我不会投。使用?? 运算符

http://msdn.microsoft.com/en-us/library/ms173224(VS.80).aspx

bool? isAvailble = null;

//string displayIsAvailble = (bool)(isAvailble) ? "Yes" : "No"; //exception Nullable object must have a value.

string displayIsAvailble = (isAvailble ?? false) ? "Yes" : "No";  //outputs "no"

Console.WriteLine(displayIsAvailble);

【讨论】:

    【解决方案3】:

    (bool)(objContract.IsAvailble) ? "Yes" : "No"

    【讨论】:

      【解决方案4】:

      我可以建议的最好的方法是始终转换为可空值,然后使用空值合并运算符说出您希望该值为空值时的值。例如:

          string s3 = (bool?)b ?? false ? "yes" : "no";
      

      无论 b 定义为 bool 还是 bool,上述方法都有效?

      【讨论】:

        【解决方案5】:
        Convert.ToBoolean(objContract.IsAvailble) ? "yes" : "no"
        

        这是你要找的吗?

        bool? n = false;
        bool nn = true;
        
        Console.WriteLine(n ?? nn); 
        

        【讨论】:

          【解决方案6】:

          另一种选择:

          objContract.IsAvailble == true ? "Yes" : "No"
          

          关于nullable,只有true为true,null或false为false。在常规 bool 上,true/false 是正常的。

          【讨论】:

          • 无法转换布尔值?布尔
          • @mark - 适用于所有情况,不确定您的编译器在抱怨什么:-/
          【解决方案7】:

          你可以使用:

          bool? b1 = objContract.IsAvailable;
          string s1 = b1.Value ? "Yes" : "No";`
          

          无论objectContract.IsAvailablebool 还是bool? 或任何其他可为空的类型,这都应该有效。

          例如日期:

          DateTime? t1 = objContract.EitherNullableOrNotNullableDate;
          string s1 = t1.Value.ToString();
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-11-29
            相关资源
            最近更新 更多