2

これについてStackoverflowにも同様の質問がありますが、私の問題には役立ちません。これが私がしていることの全体像です。iDB2DataReaderのILを生成して、データベースからタイプを動的に取得し、pocoにマップしています。データをプルするためにnullableを取得するのに問題があります。

だから私はリフレクションを介してmethodinfoを返す必要があるメソッドを持っています。これを取得するために、必要なタイプの「getmethod」を使用しています。コードは次のとおりです。

private static MethodInfo GetDataMethod(Type destinationDataType, Type underlyingDestinationDataType, iDB2DataReader reader)
{
    MethodInfo methInfo = null;

    if (_readerDataMethods.ContainsKey(destinationDataType))
    {
        methInfo = _readerDataMethods[destinationDataType];
    }
    else
    {

        if (underlyingDestinationDataType != null)
        {
            //trying to get underlying type which would be DateTime thus resulting in GetDatetime.
            methInfo = reader.GetType().GetMethod("Get" + underlyingDestinationDataType.Name);
        }
        else
            methInfo = reader.GetType().GetMethod("Get" + destinationDataType.Name);
        //methInfo = reader.GetType().GetMethod("Get" + destinationDataType.ToGenericTypeString());

        if (methInfo != null)
        {
            _readerDataMethods[destinationDataType] = methInfo;
        }
    }

    return methInfo;
}

コードコメントからわかるように、基になるタイプの日時を取得しますが、これは機能せず、「操作によってランタイムが不安定になる可能性があります」というランタイムエラーが発生します。

本当の問題は、のgetmethodに使用する名前がわからないことですNullable<DateTime>。または、少なくとも私はそれがそれほど単純であることを望んでいました。どんな助けでもいただければ幸いです。

4

1 に答える 1

1

実際の型名はメソッド名では有効ではないため、おそらくNullablesの特殊なケースを作成する必要があります。それがNullable型であるかどうかを確認し、リフレクションを使用してジェネリックパラメーターを取得します。

例:

Type t = typeof (Nullable<DateTime>);

Console.WriteLine(t.Name);   // Nullable`1
if (t.IsGenericType && t.GetGenericTypeDefinition() == typeof(Nullable<>))
{
    Type t2 = Nullable.GetUnderlyingType(t);
    Console.WriteLine("Nullable"+t2.Name); // NullableDateTime
}
于 2012-08-21T15:59:23.393 に答える