0

オブジェクトのすべてのプロパティを調べ、値が t 型の辞書であるプロパティに対して何らかの処理を行うジェネリック型 T を持つ拡張メソッドを作成する必要があります。

public static T DoDictionaries<T,t>(T source, Func<t,t> cleanUpper)
{

 Type objectType = typeof(T);
 List<PropertyInfo> properties = objectType.GetProperties().ToList();
 properties.Each(prop=>
      {
        if (typeof(Dictionary<????, t>).IsAssignableFrom(prop.PropertyType))
           {
                Dictionary<????, t> newDictionary = dictionary
                     .ToDictionary(kvp => kvp.Key, kvp => cleanUpper(dictionary[kvp.Key]));
                prop.SetValue(source, newDictionary);
           }
      });
 return source;
}

1 つのオブジェクトにさまざまなキーの型を持つ多くの辞書が存在する可能性があるため、辞書のキーの型に別のジェネリック型 ``k'' を使用することはできません。明らかに、上記のコードの代わりに別のことを行う必要があります。これを行う方法がわかりません。ありがとう

4

1 に答える 1

2
public static TSource DoDictionaries<TSource, TValue>(TSource source, Func<TValue, TValue> cleanUpper)
    {
        Type type = typeof(TSource);

        PropertyInfo[] propertyInfos = type
            .GetProperties()
            .Where(info => info.PropertyType.IsGenericType &&
                           info.PropertyType.GetGenericTypeDefinition() == typeof (Dictionary<,>) &&
                           info.PropertyType.GetGenericArguments()[1] == typeof (TValue))
            .ToArray();

        foreach (var propertyInfo in propertyInfos)
        {
            var dict = (IDictionary)propertyInfo.GetValue(source, null);
            var newDict = (IDictionary)Activator.CreateInstance(propertyInfo.PropertyType);
            foreach (var key in dict.Keys)
            {
                newDict[key] = cleanUpper((TValue)dict[key]);
            }
            propertyInfo.SetValue(source, newDict, null);
        }

        return source;
    }
于 2013-04-02T16:29:11.007 に答える