使用反射调用静态方法时获取错误的返回值?

时间:2011-03-29 21:12:20

标签: c# .net reflection

我有两种名为EffectEffectMethods的类型,它是我调用方法的静态类:

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 } );
    }
}

我收到了错误的结果。此处thisEffect的当前实例,因为它是包含反射调用的类型。

基本上我计算的一个值是一个返回操作是否成功的标志。但是这个值在代码中设置为true,但是在方法通过反射返回后,结果是不同的。

我这样做错了吗?有什么我想念的吗?我可以清楚地看到方法中的值是真实的,但在呼叫网站上,它显示的方式不同。

2 个答案:

答案 0 :(得分:2)

我不明白为什么它应该返回“坏价值”。你没有提供完整的代码,所以我只能给你两个猜测。

  1. EffectResult的构造函数中,您忘记将success参数设置为属性,或者属性实现错误。

  2. 用于获取方法的Type不是EffectMethods,或者您的AppDomain中有不同实现的重复程序集。检查已加载的模块。

答案 1 :(得分:1)

你可以发布更多代码吗?我猜测一些基于你所展示的代码的定义。使用我猜测的定义我没有问题,当然我假设只有一个公共静态方法和一些基本定义等。

对于那些类或骨架,查看实际代码会更有帮助。尽管如此,它仍然有用。

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);
    }
}