1

次のコードを使用して、現在のフィールド値の現在の値を次のように変更しました

FieldInfo connectionStringField = GetType().BaseType.GetField("_sqlConnectionString", BindingFlags.Instance | BindingFlags.NonPublic);  

connectionStringField.SetValue(this, connectionString);  

しかし、私のクエリはconnectionstringfiedの現在の値を取得することです...

私は以下のコードを試しました

getvalue(obj ss);

貴重なご意見をお待ちしております

null値がスローされます

4

3 に答える 3

2

フィールドが見つかった場合connectionStringField(つまり、それが基本型にあり、"_sqlConnectionString" と呼ばれている場合)、次のようになります。

string connectionString = (string)connectionStringField.GetValue(this);

?

ただし、リフレクションを使用して公開されていないフィールドと対話するのは... 珍しいことです。

于 2012-11-08T09:48:51.997 に答える
1
public static string GetPropertyValue<T>(this T obj, string parameterName)
    {
        PropertyInfo[] property = null;
        Type typ = obj.GetType();
        if (listPropertyInfo.ContainsKey(typ.Name))
        {
            property = listPropertyInfo[typ.Name];
        }
        else
        {
            property = typ.GetProperties();
            listPropertyInfo.TryAdd(typ.Name, property);
        }
        return property.First(p => p.Name == parameterName).GetValue(obj, null).ToString();
    }

listPropertyInfo は、リフレクションのパフォーマンスの問題を回避するためのキャッシュです

于 2012-11-08T10:18:29.277 に答える
0
public static void SetPropertyValue<T>(this T obj, string parameterName, object value)
    {
        PropertyInfo[] property = null;
        Type typ = obj.GetType();
        if (listPropertyInfo.ContainsKey(typ.Name))
        {
            property = listPropertyInfo[typ.Name];
        }
        else
        {
            property = typ.GetProperties();
            listPropertyInfo.TryAdd(typ.Name, property);
        }
        if (value == DBNull.Value)
        {
            value = null;
        }
        property.First(p => p.Name == parameterName).SetValue(obj,value, null);
    }

セッターにも同じトリックを使いました

于 2012-11-08T11:08:14.770 に答える