C# 限制匿名类型在C中的使用#

C# 限制匿名类型在C中的使用#,c#,asp.net-mvc,anonymous-types,C#,Asp.net Mvc,Anonymous Types,我想搜索所有使用Controllers中匿名类型的地方,如下所示 if(success) { returnData = JsonConvert.SerializeObject(new { Success = true, Message = "Operation completed successfully" }); } else { returnData = JsonConvert.SerializeObject(new { Success = false, Message =

我想搜索所有使用
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”}
,编译器将不会发出任何警告/错误,并且这将导致客户端脚本中出现运行时错误


如果您有任何关于限制这种情况或检测这种情况的见解,我们将不胜感激。

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


只是不要使用匿名类型。使用计划使用的数据创建新的混凝土类型:

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" });
}

如何包装json调用,以便您可以获得运行时错误/断言:

首先是从这里检测匿名的扩展:

然后用它作为你的新方法

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

现在,您可以轻松搜索直接非法调用
JsonConvert.SerializeObject
的位置。

是的,我已经这样做了,但我希望有一些可以在自动报告中使用的内容,如TFS Build Warnings。当我标记您的建议作为我问题的答案时,我想知道的是,是否有任何方法可以检测任何编译器开关或类似的东西对匿名类型的使用情况,这样,如果开发人员绕过该准则,他们会立即知道。@SudevG编译器无法告诉您这一点,但您可能会使用第三方代码分析工具,如Resharper。我对它不是很熟悉,但我知道您可以使用它为类似的事情编写验证脚本。不确定它的脚本框架是否足够强大,或者像这样的东西是否容易/难。问题是关于搜索和限制匿名类型的使用。你的答案应该是评论。@lazyberezovsky我觉得很可笑,你不得不开始搜索我的所有答案,试图找到一个NAA,仅仅因为我对你的一个不恰当的答案进行了点名。至于这个答案,OP觉得把它标记为合适的答案,所以很明显这不是一个完全无关的切线。你们真的应该学会更从容地接受批评,学会承认自己做错了什么。@Servy这就是我所说的——由OP决定答案对他想要完成的任务有多大帮助。对于初学者来说,展示他们不知道的其他解决方案是非常有用的。如果我觉得别人的答案有用,我从不投反对票。若答案不正确,那个么是的,值得投下一票。PS在你的历史中找到这样的答案不到一分钟(每个人都有这样的答案)。所以,你该承认自己做错了:)
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);
   }