如何通过反射将枚举值传递给方法
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];
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];