【问题标题】:Is it possible to have a compile time check that a type is marked with the Serializable attribute是否可以进行编译时检查类型是否标记有 Serializable 属性
【发布时间】:2011-06-15 17:56:25
【问题描述】:

具体来说,我们正在使我们的应用程序与进程外会话状态服务器兼容,其中保存在会话中的所有类型都必须是可序列化的。

有没有办法在编译时查看放入 HttpSessionState 的任何类型都标有 Serializable 属性。类似于此“无效”代码的内容

public static void Put<T>( string key, T value ) where T : IsMarkedWitheSerializableAttribute
{
   HttpContext.Current.Session[key] = value;
}

【问题讨论】:

    标签: c# asp.net .net-3.5 session-state compile-time


    【解决方案1】:

    不,不存在这样的通用约束。属性通常是用来表示一个类型的实现。您必须引入自己的标记接口 (urgh) 或插入执行时检查并希望您的测试足够。

    Eric Lippert's post about properties and attributes 很适合在这里阅读。这不是完全同一个问题,因为它更多地谈论对象与类型,但它在表达机制的属性方面仍然相关。

    【讨论】:

    • 如果我需要与静态成员的接口,这是最好的模式吗?例如,我希望能够使用通用方法实例化 ascx 控件,以便能够执行 'var control = Page.LoadControl();'代替'var control = (MyControl)Page.LoadControl("~/MyControl.ascx");'。所以我添加了一个 AscxPath 属性,其中包含我的控件的路径和 Page 上的扩展方法,我唯一不喜欢的是没有编译时间检查。
    • @Guillaume86:老实说,除了缺少演员表之外,我不清楚还有什么不同。
    • 对不起我解释的不是很好,我需要的静态成员是ascx路径(控件在不同的文件夹,例子是简化)。
    • 我只想在每次实例化控件(DRY)时摆脱所有这些路径字符串。
    • @Guillaume86:好的,我明白你的意思了。您可以在这里使用约定,并根据类型名称计算出路径名称吗?我以前用过,效果很好。
    【解决方案2】:

    您可以编写自定义 FxCop 规则来为这种情况生成警告。

    Jason Block 在his site 上有一个示例规则。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多