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/

     

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章