如何通过反射将{enum值传递给方法

时间:2015-05-13 05:30:06

标签: c# .net c#-4.0 reflection enums

class Program
{
    static void Main(string[] args)
    {
        Type[] types = Assembly.GetExecutingAssembly().GetTypes();

        Type TEnum = types.Where(d => d.Name == "TEnum").FirstOrDefault();
        var values = TEnum.GetEnumValues();
        var error = new object();
        foreach (var value in values)
        {
            if (value.ToString() == "Test2")
            {
                error = value;

            }
        }

        TestMethod("A",ref error);
    }

    public static void TestMethod(string a, ref TEnum b)
    {

    }

    public enum TEnum
    {
        Test, 
        Test2
    }

}

在上面的代码中,我试图通过我从refection得到的枚举。这只是一个示例代码,实际上TestMethod(字符串a,ref TEnum b)和枚举TEnum在不同的程序集中,我通过Reflection加载。在此示例中,我如何将枚举作为参数传递给方法。目前我收到编译错误。

提前致谢

3 个答案:

答案 0 :(得分:2)

您需要对测试方法进行更改,以便它接受更通用的类型称为对象。

但是在你查看评论的情况下,你似乎无法改变方法的签名。你有另一种使用反射的方法。请注意,它比常规调用(从项目中引用的程序集调用)花费更多。

使用这样的反射调用Test方法。

using System;
using System.Linq;
using System.Reflection;

public class Program
{
    public static void Main()
    {
        Program p = new Program();
        Type[] types = Assembly.GetExecutingAssembly().GetTypes();
        Type TEnum = types.Where(d => d.Name == "TEnum").FirstOrDefault();
        var values = TEnum.GetEnumValues();
        var error = new object ();
        foreach (var value in values)
        {
            if (value.ToString() == "Test2")
            {
                error = value;
            }
        }

        var program = Assembly.GetExecutingAssembly().GetTypes().First(d => d.Name == "Program");
        foreach (var method in program.GetMethods())
        {
            if (method.Name == "TestMethod")
            {
                method.Invoke(null, new object[2] // may need to pass instance in case of instance method.
                {
                "A", error
                }

                );
            }
        }
    }

    public static void TestMethod(string a, ref TEnum b)
    {
        Console.WriteLine("test");
    }
}

public enum TEnum
{
    Test,
    Test2
}

点击here查看dotnet小提琴。

答案 1 :(得分:1)

您可以使用反射从其类型中获取方法并调用它。

       var args = new[] { "A", error };
        parentType.GetMethod("TestMethod").Invoke(null, "A",args);
        error = args[1];

答案 2 :(得分:0)

您需要使用Enum.Parse将值转换为枚举表示。

例如

if (value.ToString() == "Test2")
{
    var testEnum = (TEnum)Enum.Parse(typeof(TEnum), value);
}

然后,您应该能够将testEnum传递给TestMethod。

编辑:

由于您说您无法直接访问TEnum,因此您可以尝试使用Convert.ChangeType(请参阅此答案了解更多信息:Setting a property by reflection with a string value)。

例如

Type tEnum = types.Where(d => d.Name == "TEnum").FirstOrDefault();

if (value.ToString() == "Test2")
{
    object testEnum = Enum.Parse(tEnum.GetType(), value);
    var testEnumType = Convert.ChangeType(testEnum, tEnum.GetType());
}