Тип параметра Infer, основанный на использовании - PullRequest
1 голос
/ 08 декабря 2011

У меня проблема с проводной связью, я знаю, что для логического вывода требуется использование открытого универсального типа.

Это способ вызова AssertDictionary (o2, o1);Отражением.Что я хочу, так это использовать тип o1, скажем t1, и o2, сказать t2 как AssertDictionary (o1, o2);

имеет ли это смысл?

 public static void Main(String[] args)
    {
        Dictionary<int, Person> actual = new Dictionary<int, Person>();
        actual.Add(10, new Person{Address="Abc", Name = "Dipak"});

        Dictionary<int, Person> expected = new Dictionary<int, Person>();
        expected.Add(10, new Person { Address = "Abc", Name = "Dipak" });

        object o1 = actual;
        object o2 = expected;
        CallAssert(o1, o2);
    }

     private static CallAssert(object exp, object act)
     {
            AssertDictionary(exp, act);// I'm doing it at runtime by reflection and actual & expected are of type System.Object
     }


 private static void AssertDictionary<TKey, TVal>(Dictionary<TKey, TVal> expected, Dictionary<TKey, TVal> actual)
    {
        if (expected != null && actual != null)
        {
            foreach (KeyValuePair<TKey, TVal> valuePair in expected)
            .....
            .....
        }
     }

Можно ли создать динамический метод во время выполнения и вызвать из него AssertDictionary с общими типами?

Ответы [ 2 ]

2 голосов
/ 08 декабря 2011

Если вы уверены, что вам нужно использовать отражение, вы можете сделать это следующим образом (при условии, что Program - это тип, содержащий AssertDictionary()):

// get the method
var openMethod = typeof(Program).GetMethod(
    "AssertDictionary", BindingFlags.NonPublic | BindingFlags.Static);

// get type arguments of the dictionary
var dictTypeArgs = o1.GetType().GetGenericArguments();

// set the type parameters of the method
var closedMethod = openMethod.MakeGenericMethod(dictTypeArgs);

// invoke the method
closedMethod.Invoke(null, new [] { o1, o2 });

Другой вариант - использовать dynamic и автоматически выводит параметры типа во время выполнения:

AssertDictionary((dynamic)o1, (dynamic)o2);

Я думаю, что здесь нет необходимости создавать какие-либо динамические методы.

0 голосов
/ 08 декабря 2011

если вы планируете использовать рефлексию, вы предполагаете, что вы уже знаете тип unles, который вы планируете перебирать через члены.

попробуйте это:

        Dictionary<int, Person> actual = new Dictionary<int, Person>();
        actual.Add(10, new Person { Address = "Abc", Name = "Dipak" });

        Dictionary<int, Person> expected = new Dictionary<int, Person>();
        expected.Add(10, new Person { Address = "Abc", Name = "Dipak" });

        object o1 = actual;
        object o2 = expected;

        AssertDictionary((Dictionary<int, Person>)o2, (Dictionary<int, Person>)o1);

Или вы можете сказать компилятору, что вы уверены, что делаете, используя ключевое слово dynamic.

AssertDictionary((dynamic)o1, (dynamic)o2);

и избегатьПриведение каждого типа к типу динамическое, тогда вы должны вместо этого изменить метод Я не рекомендую использовать эту технику, хотя * svik-код

    private static void AssertDictionary(dynamic expected, dynamic actual)
    {
        // you will be able to call methods as:
        actual.Add(1, new Person()); // intelisence will not help you you have to be carefull with the dynamic type
        // I dont recoment using it if there is a work around
    }
выглядит намного лучше.Я буду использовать его код, если я, где вы ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...