Получение неправильных возвращаемых значений при использовании отражения для вызова статического метода? - PullRequest
1 голос
/ 30 марта 2011

У меня есть 2 типа с именами Effect и EffectMethods, которые являются статическим классом, для которого я вызываю метод:

public class EffectMethods
{
    public static EffectResult Blend (Effect effect)
    {
        bool success = true;
        return new EffectResult ( effect.Type, success );
    }
}

Я нахожу правильный метод, используя:

Type.GetMethods ( BindingFlags.Public | BindingFlags.Static );

и отфильтруйте правильный.

Но когда я это называю:

( EffectResult ) method.Invoke ( null, new object [ ] { this } );
public class Effect
{
    public EffectResult Apply()
    {
        var methods = Type.GetMethods ( BindingFlags.Public | BindingFlags.Static );
        var method = methods.First ( ... );

        // This result value is now different (success = false)
        return ( EffectResult ) method.Invoke ( null, new object [ ] { this } );
    }
}

Я получаю неправильный результат. Здесь this является текущим экземпляром Effect, потому что это тип, который включает вызов отражения.

По сути, одно из значений, которые я вычисляю, - это флаг, который возвращает информацию об успешности операции. Но это значение установлено в true в коде, но после возврата метода методом отражения результат будет другим.

Я делаю это неправильно? Есть ли что-то, что мне не хватает? Я четко вижу значение true в методе, но на сайте вызовов оно отображается по-другому.

Ответы [ 2 ]

2 голосов
/ 30 марта 2011

Не понимаю, почему должно возвращаться "плохое значение".Вы не предоставили полный код, поэтому я могу дать вам только два моих предположения.

  1. В конструкторе EffectResult вы забыли установить параметр success для свойстваили неправильная реализация свойства.

  2. Type, из которого вы получаете методы, отличается от EffectMethods, или у вас есть дублирующиеся сборки с разными реализациями в вашем AppDomain.Проверьте загруженные модули.

1 голос
/ 30 марта 2011

Можете ли вы опубликовать больше кода? Я предполагаю, что некоторые определения основаны на коде, который вы показываете. Используя мои угаданные определения, у меня нет проблем, конечно, я предполагаю, что есть только один публичный статический метод и несколько базовых определений и т. Д.

Было бы более полезно увидеть ваш реальный код для этих классов или скелета. Используя их, хотя, это работает.

using System;
using System.Reflection;

public enum EffectType
{
    A,
    B
}

public class Effect
{
    public EffectType Type { get; set; }
}

public class EffectResult
{
    public EffectType Type { get; set; }
    public bool Success { get; set; }

    public EffectResult(EffectType type, bool success)
    {
        Type = type;
        Success = success;
    }
}

public class EffectMethods
{
    public static EffectResult Blend(Effect effect)
    {
        bool success = true;
        return new EffectResult(effect.Type, success);
    }
}

public static class Program
{
    public static void Main()
    {
        var methods = typeof (EffectMethods).GetMethods(BindingFlags.Public | BindingFlags.Static);

        var result = methods[0].Invoke(null, new object[] { new Effect { Type = EffectType.A } });

        Console.WriteLine(result);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...