5

これは、T4 を使用してクラスを生成するためのプロジェクト テンプレートはありますか? に関連しています。質問。nvarchar適切に型指定されたクラス プロパティを生成するために必要な文字列 ( ) パラメーター値のリストがあります。

値はすべてプリミティブ (最も複雑なものDateTime) であり、集合 { int, double, bool, DateTime} 内にあります。現在、私はそのようなリストの 1 つ (多くのリストの 1 つ) の型指定されたプロパティを手動でコーディングし、最初にDateTime.TryParseExact. それが失敗した場合は、 を試しDouble.TryParse、最後に推測をあきらめて、それが本当に文字列であると仮定します。

これはかなり健全なアプローチですか、それとも他のより複雑で正確な方法を使用する必要がありますか?

4

2 に答える 2

3

値のセットが単なるものである場合、[double, DateTime, bool]これは網羅的ではありますが、かなり適切な方法です。これらのセット間に単純に重複があります (trueは常に aboolであり、5決して aではありませんbool)。

との両方を持つintdouble、重複する部分が多いため、この命題は少し不安定になります。基本的に anyは と見なすこともintできますdouble4たとえば、値セットに表示されている場合、どのように解釈すればよいですか? 両方の方法で解釈でき、時間の経過とともに値が変化すると、生成されたコードのタイプも変化することがわかります。

単に偶然に、列に常に整数が含まれているかどうかを考えてみてください。したがって、値を生成しint、値に依存するコードを少し書きましたint。その後、約 1 か月後に非整数が追加され、突然値が吐き出されdoubleます。これはおそらくコードに重大な影響を与えるでしょう。

個人的に私が取るアプローチは、コンテンツのタイプを決定する別のテーブルを持つことです。

于 2013-08-21T14:40:40.877 に答える
2

とを見てConvert.ChangeTypeくださいTypeDescriptor.GetConverter

これを行うための拡張メソッドを作成しました。

public static T Convert<T>(this object obj)
{
  T result;
  try
  {
    result = (T)System.Convert.ChangeType(obj, typeof(T));

    if (object.ReferenceEquals(result, null))
    {
      var typeConverter = !obj.IsNullable()
        ? TypeDescriptor.GetConverter(typeof(T))
        : new NullableConverter(typeof(T));

      result = obj is string
        ? (T)typeConverter.ConvertFromString(obj as string)
        : (T)typeConverter.ConvertTo(obj, typeof(T));
    }
  }
  catch (Exception)
  {
    result = default(T);
  }

  return result;
}

public static bool IsNullable<T>(this T obj)
{
  return Nullable.GetUnderlyingType(typeof(T)) != null;
}

使用法:

var itemsToConvert = new[] { "4", "5.98", "false", DateTime.Now.ToString() };
var @int = itemsToConvert[0].Convert<int>();
var @double = itemsToConvert[1].Convert<double>();
var @bool = itemsToConvert[2].Convert<bool>();
var @dateTime = itemsToConvert[3].Convert<DateTime>();

Console.WriteLine(@"int: {0}, Type: {1}", @int, @int.GetType());
Console.WriteLine(@"double: {0}, Type: {1}", @double, @double.GetType());
Console.WriteLine(@"bool: {0}, Type: {1}", @bool, @bool.GetType());
Console.WriteLine(@"DateTime: {0}, Type: {1}", @dateTime, @dateTime.GetType());

出力:

int: 4、型: System.Int32
double: 5.98、型: System.Double
bool: False、型: System.Boolean
DateTime: 2013/08/21 06:01:07 PM、型: System.DateTime

お役に立てれば。

于 2013-08-21T16:04:05.780 に答える