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加载。在此示例中,我如何将枚举作为参数传递给方法。目前我收到编译错误。
提前致谢
答案 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());
}