如何解决创建方法的 DeclaringType 的实例:Activator.CreateInstance
我又一次在反思中挣扎。我只是给你一段我的调试器不咬人的代码:
public bool HandleCommand(string command)
{
MethodInfo m = methods.FirstOrDefault(t => t.GetCustomAttribute<CommandAttribute>().Name == command);
ICommandSet set =(m.DeclaringType)Activator.CreateInstance(m.DeclaringType);
m?.Invoke(set,null);
return true;
}
基本上,此代码位于名为 CommandHandler 的类中。当它被构造时,它会循环执行程序集中实现某个接口的所有类型,并将它们所有附加有 CustomAttribute 的方法存储在 List 中;对于这个问题的目的,我只是假设一切都在那里工作。该属性只有一个属性:
[AttributeUsage(AttributeTargets.Method)]
public class CommandAttribute : Attribute
{
public string Name { get; set; }
public CommandAttribute(string name)
{
Name = name;
}
}
现在在您上面看到的方法 HandleCommand() 方法中,我存储的方法的 name 属性等于我在 MethodInfo m 中传入的字符串。现在我的问题本质上是,我如何正确调用此方法。 m.Invoke 需要一个调用它的对象,并且因为传入“this”不起作用,并且在线示例总是传入定义它的类的一个实例,我想我需要创建一个类 m 的实例是定义并将其传递给 Invoke() 方法。在实践中,这比我想象的要困难得多,我最好的猜测是你可以在上面看到的激活器。
ICommandSet set =(m.DeclaringType)Activator.CreateInstance(m.DeclaringType);
首先,我确信在其中声明了 m 的类实现了 ICommandSet,因为这是要检查方法的类型的具体化。所以这就是我说“ICommandSet set”的原因。然后激活器应创建此实例。但它不起作用。提供的唯一错误消息指出 m 是一个变量,但用作类型。但是,当我将它作为参数传递给 Activator.CreateInstance() 时,编译器似乎可以很好地挖掘它。我绝对不知道如何解决这个问题,因为我真的不明白问题出在哪里。有谁能帮帮我吗?
还有,所有的方法都是在不同的类甚至项目中定义的,所以我不知道这些方法是在哪个类中定义的。
解决方法
您收到此消息的原因是您的语法错误。您不能使用变量取消引用作为期望类型执行强制转换。正如您已经知道的那样,您希望将“set”视为对其进行转换的“ICommandSet”。
var set = (ICommandSet) Activator.CreateInstance(m.DeclaringType);
你也可以做到安全
var set = Activator.CreateInstance(m.DeclaringType) as ICommandSet;
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。