【问题标题】:Restricting usage of Anonymous Type in C#限制 C# 中匿名类型的使用
【发布时间】:2012-11-21 14:39:29
【问题描述】:

我想搜索所有使用Controllers 中的匿名类型的地方,如下所示。

if(success) {
    returnData = JsonConvert.SerializeObject(new { Success = true, Message = "Operation completed successfully" });
}
else {
    returnData = JsonConvert.SerializeObject(new { Success = false, Message = "Operation failed" });
}

在上述情况下,returnData 是一个JsonResult,它在我们的Razor 视图中用于解析AJAX 请求的状态。

我想在这种情况下尽量减少匿名类型的使用,因为这可能是维护问题,因为如果任何一行写成new { Succes = true, Message = "Operation completed successfully"},编译器不会引发任何警告/错误,这会导致运行时错误在客户端脚本中。

任何有关限制此类情况或检测此类情况的见解将不胜感激。

【问题讨论】:

    标签: c# asp.net-mvc anonymous-types


    【解决方案1】:

    为什么不在解决方案/项目中搜索“使用正则表达式”选项?

    \bnew\s*{
    

    【讨论】:

    • 是的,我已经这样做了,但是我想要一些可以在自动报告中使用的东西,比如 TFS 构建警告。
    【解决方案2】:

    只是不要使用匿名类型。使用您计划使用的数据创建一个新的具体类型:

    public class JSONMessage
    {
        public string Message { get; set; }
        public bool Success { get; set; }
    }
    

    那么这些行可以改为:

    if(success) {
        returnData = JsonConvert.SerializeObject(new JSONMessage(){ Success = true, Message = "Operation completed successfully" });
    }
    else {
        returnData = JsonConvert.SerializeObject(new JSONMessage(){ Success = false, Message = "Operation failed" });
    }
    

    【讨论】:

    • 虽然我将您的建议标记为对我的问题的回答,但我想知道的是有没有办法通过任何编译器开关或类似的东西来检测匿名类型的使用,以便如果开发人员绕过他们立即了解的指南。
    • @SudevG 编译器无法告诉您这一点,但您可能会使用第 3 方代码分析工具,例如 Resharper。我对它不是很熟悉,但我知道你可以用它来为 like 这个东西编写验证脚本。不确定它的脚本框架是否足够强大,或者对于这样的事情是否容易/困难。
    • 问题是关于搜索和限制匿名类型的使用。您的回答应该是评论。
    • @lazyberezovsky 我发现你不得不开始搜索我所有的答案以试图找到 NAA 只是因为我因为你的一个不恰当的答案而叫你出来,这很有趣。至于这个答案,OP 认为将其标记为 the 答案是合适的,因此显然它不是完全不相关的切线。你真的应该学会更好地接受批评,并学会在做错事时承认。
    • @Servy 我在说什么 - 由 OP 决定回答对他想要完成的任务有多大帮助。对于初学者来说,展示他们不知道的其他解决方案非常有用。如果我发现他们有帮助,我从不反对其他人的答案。如果答案不正确,那么是的,值得一票。 PS在你的历史中找到这样的答案不到一分钟(而且任何人都有这样的答案)。所以,是时候让你承认自己做错了:)
    【解决方案3】:

    如何结束 json 调用,以便您可以有运行时错误/断言:

    首先从这里检测匿名的扩展:Determining whether a Type is an Anonymous Type

    public static class TypeExtension {
    
        public static Boolean IsAnonymousType(this Type type) {
            var hasCompilerGeneratedAttribute = type.GetCustomAttributes(typeof(CompilerGeneratedAttribute), false).Count() > 0;
            var nameContainsAnonymousType = type.FullName.Contains("AnonymousType");
            var isAnonymousType = hasCompilerGeneratedAttribute && nameContainsAnonymousType;    
            return isAnonymousType;
        }
    }
    

    然后使用它作为你的新方法。

     public static object JsonSeralize(object obj)
       {
          Debug.Assert(!obj.getType().IsAnonymousType());     
          return JsonConvert.SerializeObject(obj);
       }
    

    现在您可以轻松搜索直接非法拨打JsonConvert.SerializeObject的地方。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-26
      相关资源
      最近更新 更多