如何通过反射将枚举值传递给方法

How to pass enum value to method through reflection

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
    }

}

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

提前致谢

您需要使用 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());
}

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

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

像这样使用反射调用测试方法。

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查看dotnetfiddle。

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

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