【发布时间】:2018-11-12 14:38:13
【问题描述】:
public abstract class Unit
{
public abstract List<Move> allowedMoves{get;}
}
public class Javelineer : Unit
{
public List<Move> allowedMoves =>
new List<Move> {Move.Impale, Move.JavelinThrow, Move.ShieldBlock};
}
public class Dragon : Unit
{
public List<Move> allowedMoves =>
new List<Move> {Move.BreatheFire, Move.Swipe, Move.Bite, Move.Devour, Move.TailBash};
}
X:
鉴于上述代码,我是否以及如何在不必实例化新对象的情况下检索给定单元的允许移动?
我知道我可以使用此代码检索该属性:
typeof(Javelineer).GetProperty("allowedMoves")
但是如果以及如何检索此属性的定义?
Y:
客户端(网络浏览器)必须将玩家单位发送给游戏服务器。这包括单位的类型和该单位能够执行的动作(所有可用的 4 个;类似于口袋妖怪)。
虽然验证(当然)是在服务器上执行的,但浏览器仍然需要获取可用单位类型和允许移动的列表。
为了不重复代码,我想避免在 Javascript 中对这些数据进行硬编码。
读过some excellent SO questions & answers 我想我可以用类似下面的代码检索所有可用的单元:
Assembly.GetExecutingAssembly().GetTypes().Where(
type => type.BaseType == typeof(Unit)
).Select(type => type.Name).ToList()
我会在服务器启动时调用此代码,缓存结果并将缓存结果发送到每个连接的客户端,因为我觉得调用此代码可能很昂贵。
但是我怎样才能检索允许移动的列表呢?
【问题讨论】:
-
要获得允许移动的列表,您有 3 个选项。 1)您构造对象的实例并读取属性,或 2)您使用 mono.cecil 或其他一些 IL 检查库并检查 IL,解码指令并模拟运行时。 第二种选择完全不现实。选项 3) 是将可能的移动列表分离成可以通过反射读取的内容。这第三个选项可能不会比选项 1 更好。最重要的是,构建实例。
-
@LasseVågsætherKarlsen 如果您将此作为答案,我会接受。
标签: c# reflection properties system.type