• C# [ModelName]标记 模型,类名称重复。


    前几天遇到一个不算bug的bug  记录分享一下

         出错情况

          webapi  程序会自带一个模板  如图

       

       点某一个接口进去后

      

        出错原因

         model实体中出现了名称一样的(并不会影响程序运行和接口的访问只针对上面类似情况)

           解决方法

         1.[ModelName]标记

             2. 让他获取完整的命名空间

             这边只说第二种解决方式  简单简洁统一

    在ModelNameHelper中,用此替换类的内容。

    在HelpPageSampleGenerator中,将WriteSampleObjectUsingFormatter方法替换为此方法

    namespace HelpPageErrorSimulator.Areas.HelpPage.ModelDescriptions  
    {  
        internal static class ModelNameHelper  
        {  
            // Modify this to provide custom model name mapping.  
            public static string GetModelName(Type type)  
            {  
                ModelNameAttribute modelNameAttribute = type.GetCustomAttribute<ModelNameAttribute>();  
                if (modelNameAttribute != null && !String.IsNullOrEmpty(modelNameAttribute.Name))  
                {  
                    return modelNameAttribute.Name;  
                }  
      
                string modelName = type.FullName;  
                if (type.IsGenericType)  
                {  
                    // Format the generic type name to something like: GenericOfAgurment1AndArgument2  
                    Type genericType = type.GetGenericTypeDefinition();  
                    Type[] genericArguments = type.GetGenericArguments();  
                    string genericTypeName = genericType.FullName;  
      
                    // Trim the generic parameter counts from the name  
                    genericTypeName = genericTypeName.Substring(0, genericTypeName.IndexOf('`'));  
                    string[] argumentTypeNames = genericArguments.Select(t => GetModelName(t)).ToArray();  
                    modelName = String.Format(CultureInfo.InvariantCulture, "{0}Of{1}", genericTypeName, String.Join("And", argumentTypeNames));  
                }  
      
                return modelName;  
            }  
        }  
    }  
    [SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes", Justification = "The exception is recorded as InvalidSample.")]  
    public virtual object WriteSampleObjectUsingFormatter(MediaTypeFormatter formatter, object value, Type type, MediaTypeHeaderValue mediaType)  
    {  
        if (formatter == null)  
        {  
            throw new ArgumentNullException("formatter");  
        }  
        if (mediaType == null)  
        {  
            throw new ArgumentNullException("mediaType");  
        }  
      
        object sample = String.Empty;  
        MemoryStream ms = null;  
        HttpContent content = null;  
        try  
        {  
            if (formatter.CanWriteType(type))  
            {  
                ms = new MemoryStream();  
                content = new ObjectContent(type, value, formatter, mediaType);  
                formatter.WriteToStreamAsync(type, value, ms, content, null).Wait();  
                ms.Position = 0;  
                StreamReader reader = new StreamReader(ms);  
                string serializedSampleString = reader.ReadToEnd();  
                if (mediaType.MediaType.ToUpperInvariant().Contains("XML"))  
                {  
                    serializedSampleString = TryFormatXml(serializedSampleString);  
                }  
                else if (mediaType.MediaType.ToUpperInvariant().Contains("JSON"))  
                {  
                    serializedSampleString = TryFormatJson(serializedSampleString);  
                }  
      
                sample = new TextSample(serializedSampleString);  
            }  
            else  
            {  
                sample = new InvalidSample(String.Format(  
                    CultureInfo.CurrentCulture,  
                    "Failed to generate the sample for media type '{0}'. Cannot use formatter '{1}' to write type '{2}'.",  
                    mediaType,  
                    formatter.GetType().FullName,  
                    type.FullName));  
            }  
        }  
        catch (Exception e)  
        {  
            sample = new InvalidSample(String.Format(  
                CultureInfo.CurrentCulture,  
                "An exception has occurred while using the formatter '{0}' to generate sample for media type '{1}'. Exception message: {2}",  
                formatter.GetType().FullName,  
                mediaType.MediaType,  
                UnwrapException(e).Message));  
        }  
        finally  
        {  
            if (ms != null)  
            {  
                ms.Dispose();  
            }  
            if (content != null)  
            {  
                content.Dispose();  
            }  
        }  
      
        return sample;  
    }  

            

    如您所见,通过genericType.FullName改变了type.FullName和genericType.Name的type.Name(最后一个不是必需的)。

    这样,系统将获得全名,而不是获取类的名称,包括命名空间。

    现在,帮助系统甚至可以在各种命名空间中使用具有相同名称的类。

    原文链接:https://www.c-sharpcorner.com/UploadFile/d132a2/workaround-in-Asp-Net-webapi-help-page/

         

  • 相关阅读:
    【HDOJ6666】Quailty and CCPC(模拟)
    【2019 Multi-University Training Contest 8】
    分布式锁的理解
    反射工具类【ReflectionUtils】
    Maven常用命令
    maven常用命令介绍
    mysql 优化策略(如何利用好索引)
    centos7搭建svn服务器及客户端设置
    Centos7 配置subversion
    Centos7更改网卡名称Eth0
  • 原文地址:https://www.cnblogs.com/manwwx129/p/10444781.html
Copyright © 2020-2023  润新知