2

リフレクションを使用して、クラス フィールドを把握して入力しようとしています。現在、 a のインスタンスを検出し、埋めるために aDictionary<,>を作成しています。Dictionary<object,object>その後、型を変更しようとしますが、これは機能せず、キャストに失敗します:

// Looping through properties. Info is this isntance.
// Check is a dictionary field.
Dictionary<object, object> newDictionary = new Dictionary<object, object>();

// Populating the dictionary here from file.
Type[] args = info.PropertyType.GetGenericArguments();
info.GetSetMethod().Invoke(data, new object[]
    {
        newDictionary.ToDictionary(k => Convert.ChangeType(k.Key, args[0]),
                                   k => Convert.ChangeType(k.Value, args[1]))
    });

何か案は?ありがとう。

4

3 に答える 3

10

見つけたタイプの辞書マニュアルを作成する必要があります。

Type dictionary = typeof(Dictionary<,>);
Type[] typeArgs = info.PropertyType.GetGenericArguments();

// Construct the type Dictionary<T1, T2>.
Type constructed = dictionary.MakeGenericType(typeArgs);
IDictionary newDictionary = (IDictionary)Activator.CreateInstance(constructed);

// Populating the dictionary here from file. insert only typed values below
newDictionary.Add(new object(), new object());


info.SetValue(data, newDictionary, null);

反対票を投じた人の証拠。

    static void Main(string[] args)
    {
        IDictionary<int, string> test = new Dictionary<int, string>();
        var castedDictionary = (IDictionary)test;
        castedDictionary.Add(1, "hello");
        Console.Write(test.FirstOrDefault().Key);
        Console.Write(test.FirstOrDefault().Value);
        Console.ReadLine();
    }

Dictionary<TKey, TValue> 私の例では、 ( )IDictionaryのインスタンスを作成しています。Dictionary<TKey, TValue>Type dictionary = typeof(Dictionary<,>);

public class Dictionary<TKey, TValue> : IDictionary<TKey, TValue>, 
    ICollection<KeyValuePair<TKey, TValue>>, IDictionary, ICollection, 
    IReadOnlyDictionary<TKey, TValue>, IReadOnlyCollection<KeyValuePair<TKey, TValue>>, 
    IEnumerable<KeyValuePair<TKey, TValue>>, IEnumerable, ISerializable, 
    IDeserializationCallback
于 2012-08-23T15:46:22.377 に答える
-1

必要なことをすべて実行し、正しく型指定された結果を生成するヘルパージェネリッククラスを作成します。次に、実行時に既知のタイプに基づいて、そのクラスを動的にインスタンス化します。

interface IHelper
{
    object CreateDictionary ();
}

class Helper<TKey, TValue> : IHelper
{
    public object CreateDictionary ()
    {
        return (whatever).ToDictionary<TKey, TValue>( blah );
    } 
}

var h = Activator.CreateInstance( typeof( Helper<,> ).MakeGenericType( yourKnownKeyType, yourKnownValueType ) ) as IHelper;
info.SetValue( h.CreateDictionary() );

これが非常に頻繁に発生する場合は、毎回動的インスタンス化の影響を回避するために、ヘルパーインスタンスもキャッシュする必要があります。

于 2012-08-23T15:54:55.597 に答える