Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在抽象类和它之间实现版本检查';实施_C#_.net_Abstract Class - Fatal编程技术网

C# 在抽象类和它之间实现版本检查';实施

C# 在抽象类和它之间实现版本检查';实施,c#,.net,abstract-class,C#,.net,Abstract Class,我有这个抽象类和具体实现(它们在不同的程序集中): 如您所见,我从抽象构造函数调用CheckVersion(),以消除“基本构造函数中的虚拟成员调用”消息,但我不确定这是否真的是一种方法。当然,它是有效的,但这并不意味着它总是有效的,不是吗 另外,我想知道是否可以从CheckVersion()函数中获取具体类型的名称 我知道添加新的抽象成员无论如何都会导致错误(System.TypeLoadException),我不确定是否需要这种类型的严格版本控制,但我只是好奇,如果只提供抽象类和一个实现(我

我有这个抽象类和具体实现(它们在不同的程序集中):

如您所见,我从抽象构造函数调用CheckVersion(),以消除“基本构造函数中的虚拟成员调用”消息,但我不确定这是否真的是一种方法。当然,它是有效的,但这并不意味着它总是有效的,不是吗

另外,我想知道是否可以从CheckVersion()函数中获取具体类型的名称


我知道添加新的抽象成员无论如何都会导致错误(System.TypeLoadException),我不确定是否需要这种类型的严格版本控制,但我只是好奇,如果只提供抽象类和一个实现(我知道我可以通过使用接口和/或工厂模式来做到这一点),它将如何正确地完成,你只是在愚弄静态分析——你仍然在做一个虚拟调用。如果在ctor期间需要它,可能相反,这应该是子类向下传递的必需的基本构造函数值:

protected BaseType(int version) { /* store etc */ }

public DerivedType() : base(3) {...}
或者,也可以在编译属性处进行修复:

[YourVersion(3)]
public class DerivedType {...}
并通过对以下内容的反思来查找:

YourVersionAttribute attrib = (YourVersionAttribute)
     Attribute.GetCustomAttribute(GetType(), typeof(YourVersionAttribute));
int version = attrib == null ? -1 : attrib.Version;

属性方法很有趣。也许这太过分了,但我会把它添加到我的“需要知道的好东西”列表中。只是确认一下:由于属性是在类型而不是实例上设置的,而且抽象类的GetType总是返回具体的实现,所以这样做是完全安全的?@Michael-yes
GetType()
是非虚拟的,所以您可以开始了。
YourVersionAttribute attrib = (YourVersionAttribute)
     Attribute.GetCustomAttribute(GetType(), typeof(YourVersionAttribute));
int version = attrib == null ? -1 : attrib.Version;