为了账号安全,请及时绑定邮箱和手机立即绑定

有什么方法可以将System.Type转换为用户定义的类?

有什么方法可以将System.Type转换为用户定义的类?

C#
青春有我 2021-03-28 17:15:53
因此,我正在尝试为Discord机器人设置一个自我更新的帮助命令,这就是您所需要了解的一切。要专门从命令中获取数据,它们都从我的基类ModuleArchetype派生而来,而我正在使用Reflection获取在此自动更新列表中使用的所有命令数据的列表。这里的魔术目标是访问我在每个命令模块中拥有的每个可爱构造函数中的数据。static Banana(){    Alias = "banana";    Summary = "bananas are cool";}我已经能够成功检查Type是否继承ModuleArchetype。List<ModuleArchetype> Output = new List<ModuleArchetype>; //Modules to returnvar TypeList = Assembly.GetExecutingAssembly().GetTypes();foreach(Type t in TypeList){    if(t.IsSubclassOf(typeof(ModuleArchetype)))    {        Console.WriteLine(t.Name); //to verify the check is working        Output.Add(); //the issue    }}但...Output.Add(t); //Obviously doesn't workOutput.Add((ModuleArchetype)t); //Nope, doesn't workOutput.Add(t as ModuleArchetype); //Nope如何将这种类型转换成列表可以很好地使用的形式?
查看完整描述

2 回答

?
呼如林

TA贡献1798条经验 获得超3个赞

这...


List<ModuleArchetype>

...是一个列表,其中可以包含从ModuleArchetype继承的类的实例。它不是类型列表或类本身列表。


我猜该列表对您完全没有用,因为您似乎对静态成员感兴趣,并且实例中不包含静态成员。


如果需要与从ModuleArchetype继承的类相对应的类型列表,则需要


List<Type>

一旦将所有类型存储在列表中,就可以通过反射访问其静态成员,如下所示:


foreach (var item in list)

{

    var properties = item.GetProperties(BindingFlags.Static | BindingFlags.Public);

}

如果要获取Banana的Alias属性,最终将使用:


var aliasProperty = list.Where( t => t.Name == "Banana" )

    .GetProperties(BindingFlags.Static | BindingFlags.Public)

    .Single( p => p.Name == "Alias" );

var currentValue = aliasProperty.Invoke(null) as string;

Console.WriteLine(currentValue); //Should be "banana"

当然,如果您知道要使用Banana的Alias属性,则输入起来比较容易


var currentValue = Banana.Alias;

在列表中检索项目将使您能够访问静态成员是不可能的,因为列表中的类型信息不足以使编译器不了解每个不同元素的独特属性或方法。


查看完整回答
反对 回复 2021-04-10
?
慕妹3242003

TA贡献1824条经验 获得超6个赞

您不能将一种类型添加到列表中,因为它是一种类型。您必须定义一个对象才能将其添加到列表中。

如果要创建插件系统或类似的系统。建议您创建一个界面。这将具有轻松创建对象列表以及从对象获取数据的能力。

我已经使用开放源代码的TCP服务器完成了此操作,客户端可以在该服务器上向服务器发送命令。服务器将使用在运行时加载的插件列表来激活invoke方法。

通常,我建议使用接口与您的命令类进行交互。这样,您和其他人创建的所有命令将更容易理解。


查看完整回答
反对 回复 2021-04-10
  • 2 回答
  • 0 关注
  • 224 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信