1. ホーム
  2. c#

[解決済み] 文字列をNULL可能な型に変換する(int, double, etc...)

2022-05-10 06:14:37

質問

データ変換を行おうとしています。残念ながら、データの多くは文字列で、intやdoubleなどであるべきなのですが...。

というわけで、私が手に入れたのは次のようなものです。

double? amount = Convert.ToDouble(strAmount);

この方法の問題は、strAmountが空の場合、もしそれが空であれば、私はそれをnullになるように量りたいので、私がそれをデータベースに追加するとき、カラムはnullになります。そこで、結局こう書くことにしました。

double? amount = null;
if(strAmount.Trim().Length>0)
{
    amount = Convert.ToDouble(strAmount);
}

これでうまくいくのですが、1行だったコードが5行になってしまいました。このため、特に変換する列が大量にある場合は、少し読みづらくなっています。

文字列クラスとジェネリックの拡張を使用して型を渡そうと思いました。そこで、これを試してみました。

public static class GenericExtension
{
    public static Nullable<T> ConvertToNullable<T>(this string s, T type) where T: struct
    {
        if (s.Trim().Length > 0)
        {
            return (Nullable<T>)s;
        }
        return null;
    }
}

でも、エラーが出ます。Cannot convert type 'string' to 'T?'.

これを回避する方法はあるのでしょうか?ジェネリックスを使ったメソッドの作成にはあまり慣れていません。

どのように解決するのですか?

もう一つ気をつけなければならないのは、文字列自体がNULLである可能性があるということです。

public static Nullable<T> ToNullable<T>(this string s) where T: struct
{
    Nullable<T> result = new Nullable<T>();
    try
    {
        if (!string.IsNullOrEmpty(s) && s.Trim().Length > 0)
        {
            TypeConverter conv = TypeDescriptor.GetConverter(typeof(T));
            result = (T)conv.ConvertFrom(s);
        }
    }
    catch { } 
    return result;
}