首页 > Windows开发 > 详细

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

时间:2019-02-27 17:14:21      阅读:318      评论:0      收藏:0      [点我收藏+]

前几天遇到一个不算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/

     

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

原文:https://www.cnblogs.com/manwwx129/p/10444781.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!