维护 .NET 框架和项目之间的合同
Posted
技术标签:
【中文标题】维护 .NET 框架和项目之间的合同【英文标题】:Maintaining contract between .NET framework and project 【发布时间】:2014-08-04 13:36:52 【问题描述】:我有一个非通用包装器,它可以容纳一个受支持对象的实例。支持的类型之一是DateTime
。在内部,包装器使用原始值的选择来存储值,因此DateTime
类型的实例不能立即使用,需要一个简单的表示。可以使用属性DateTime.Ticks
,它返回一个Int64
的实例(由于某种原因,long
和Int64
在DateTime.cs
中不小心互换了)。
如果DateTime.Ticks
的返回类型发生变化,不会抛出异常,对象将照常使用,这是一场灾难。常识告诉我它不会改变,但我觉得依靠这样的想法是不负责任的。现在我已经在负责执行 DateTime
的演员的代码上留下了评论,我错过了更好的选择吗?
【问题讨论】:
如果合同发生变化,想到的解决方案会在 JIT 时间导致构建失败或运行时异常。这就是你所追求的吗? DateTime.Ticks 属性的类型不会改变:这样的重大改变可能会破坏许多现有的应用程序。但您也应该知道 DateTime.Ticks 不足以持久化任意 DateTime 值:您还需要持久化 Kind 属性(Local、Utc 或 Unspecified)。 @cynic - 是的,Visual Studio 有这方面的功能吗? @Joe - 是的,我知道,DateTime
值首先转换为通用时间。
【参考方案1】:
在将框架类属性的值分配给支持原始类型字段时,您可以使用通用辅助方法。
在框架组装中:
public class FrameworkClass
public long Ticks;
在您的程序集中:
class Program
static void Main(string[] args)
var fc = new FrameworkClass() Ticks = 2 ;
long backingField;
Assign(out backingField, fc.Ticks);
Console.Error.WriteLine(backingField);
static void Assign<T, U>(out T left, U right) where U : T
left = right;
如果框架程序集发生变化,Ticks
字段不再是 long
,您的代码将不会针对新框架编译,并且如果您尝试运行针对“旧”框架编译的程序集, “新”框架,您将获得 MissingFieldException
- 不会发生任何分配。
【讨论】:
以上是关于维护 .NET 框架和项目之间的合同的主要内容,如果未能解决你的问题,请参考以下文章