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

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

     出错状况api

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

   

   点某一个接口进去后ide

  

    出错缘由this

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

       解决方法code

     1.[ModelName]标记orm

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

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

在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/

相关文章
相关标签/搜索