7

データ型を動的に変換したい。

私のコード:

private static void updateValues(SqlDataReader reader)  
{
        USR_AddressItem item = new USR_AddressItem();
        Type ConvertNewType;
        ConvertNewType = Type.GetType(item.UserId.GetType().Name);
        item.UserId = (ConvertNewType)(reader[UserDAL.USR_Address.FieldNames.UserId]);

}

ここでは動的にのみデータ型を指定します。実行時にこの変数に値を割り当てたいためです。から値を取得しますSqlDataReader。このリーダーは常に文字列値を返します。この方法をグローバルに使用します。

4

3 に答える 3

4

あなたが示す例では、次のように言う方が簡単です:

Userid = new System.Guid(value);

a のコンストラクターはGuid文字列を受け取ってオブジェクトを作成するためです。

つまり、何か他のことをしようとしている場合を除き、その場合は質問を明確にしてください!

于 2013-07-16T12:08:14.003 に答える
4

さて、あなたが必要とするのは型推論と呼ばれるものです

事前にデータ型を知る必要はありません。次のように、ランタイムにその場で解決させます。

private static void updateValues(SqlDataReader reader)  
{
    USR_AddressItem item = new USR_AddressItem();
    item.UserId = GetConverter(item.UserId)(reader[UserDAL.USR_Address.FieldNames.UserId]);
}

そして私の魔法はここにあります:

static Func<string, T>  GetConverter<T>(T example)      
{
    return (x) => Convert<T>(x); 
}


static T Convert<T>(string val)
{
        Type destiny = typeof(T);

        // See if we can cast           
        try
        {
            return (T)(object)val;
        }
        catch { }

        // See if we can parse
        try
        {
            return (T)destiny.InvokeMember("Parse", System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.InvokeMethod | System.Reflection.BindingFlags.Public, null, null, new object[] { val });
        }
        catch { }

        // See if we can convert
        try
        {
            Type convertType = typeof(Convert);
            return (T)convertType.InvokeMember("To" + destiny.Name, System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.InvokeMethod | System.Reflection.BindingFlags.Public, null, null, new object[] { val });
        }
        catch { }

        // Give up
        return default(T);
    }
于 2013-07-16T12:43:33.573 に答える
1

a の場合、Guid実際の変換がないため、大きく異なります。a を使用して a を構築するには、次のようGuidにするstring必要があります。

var guid = new Guid("DAABED91-39AC-4805-9015-1B03E4B5706A");

もちろん、これを使用することもできますが、実際の変換Reflectionを持たない型に使用するコンストラクターを決定するのはかなり複雑なアルゴリズムになります。

ただし、他の多くのタイプについては、次のように考えることができます。

// would generate something like ToInt32...
var methodName = string.Format("To{0}", t.Name.Split('.').Last());

var methodInfo = Convert.GetType().GetMethod(methodName);
if (methodInfo == null) { return default(t); }

var val = methodInfo.Invoke(null, new object[] { valToConvert });

注:このコードはテストされていません。あくまでも目安で、かなり近いと思いますが、少しマッサージする必要があるかもしれません。

于 2013-07-16T12:13:20.887 に答える