我正在制作一个模拟器,用于模拟太阳系行星和小行星之间的相互作用等。看到我正在编写的许多代码与我之前为模拟石油泄漏的项目编写的代码非常相似,我想使用泛型来重用我的旧代码。我有几个类组成了模拟器,还有一个类驻留在模拟中(在这种情况下是天体(,它作为一个通用类型参数给出。模拟器需要知道它必须为递归公式存储多少帧,这是由通用参数决定的。
public class Sim<T> where T : IEntity
{
readonly int RecursionDepth; //need to get the value from the class passed as T
//some more code
}
public interface IEntity
{
//cant require a const here, it would be a default implementation instead
//don't want a int property with get; here as there are no guarantees about the immutability
//and different instances may have different values.
//some code
}
将该值作为模拟中使用的类的常量或静态只读字段是有意义的。但是,这两个选项都不需要使用接口。当然,我可以在接口定义中添加一个属性,但据我所知,我不能要求它是只读的,并且对类的每个实例都是相同的。我真的不想求助于这样的情况,即它只是一个传递给系统的随机整数,我必须相信它会成功。
有没有什么要求我可以设置为至少对参数的不变性及其在类的所有实例中的合法性有合理的信心?
这在当前C#版本中是不可能的,但有一个预览功能可以做到这一点-接口中的静态抽象成员(提案和通用数学预览功能正在积极使用它(:
[RequiresPreviewFeatures]
public interface IEntity
{
static abstract int RecursionDepth { get; }
}
[RequiresPreviewFeatures]
class MyEntity : IEntity
{
public static int RecursionDepth => 1;
}
[RequiresPreviewFeatures]
public class Sim<T> where T : IEntity
{
readonly int RecursionDepth = T.RecursionDepth;
}
要成为早期采用者,您需要安装nugetSystem.Runtime.Experimental
,并将集合EnablePreviewFeatures
到true
添加到项目设置中(也推荐最新的框架和VS版本(:
<PropertyGroup>
<EnablePreviewFeatures>true</EnablePreviewFeatures>
</PropertyGroup>