繁体   English   中英

使用CodeDom创建通用方法

[英]using CodeDom create a generic method

我想使用codedom创建一个通用方法。

foreach (MethodInfo mhttem in sMethodName)
{
     var mth = new CodeMemberMethod();
     mth.Name = mhttem.Name;
     mth.ReturnType = new CodeTypeReference(mhttem.ReturnType.Name);
     foreach (var param in mhttem.GetParameters())
     {
         mth.Parameters.Add(new CodeParameterDeclarationExpression(param.ParameterType, param.Name)); 
     }
} 

但是在方法参数中,还会显示名称空间。 例如

    ReminderTemplate GeTemplateById(System.Guid templateId);

我只想要

    ReminderTemplate GeTemplateById(Guid templateId);

这里mth.Parameters.Add(new CodeParameterDeclarationExpression(param.ParameterType.Name,param.Name));

但是如果我有字符串类型参数,它将转换为字符串类

例如

      PendingEmail GetByEmailToSubjectBodyMsg(String emailTo, String subject, String bodyMsg);

提前致谢

CSharpCodeGenerator中有一个硬编码的类型列表,这些列表将转换为等效的C#类型。 如果全名不是C#识别的类型之一,则这些扩展方法将转换该类型的全名(名称空间+名称),将其剥离名称空间。

public static class CSharpCodeDomExtensions
{
    // Taken from CSharpCodeGenerator.GetBaseTypeOutput(CodeTypeReference typeRef)
    private static readonly HashSet<string> BaseTypes = new HashSet<string>
    {
        "system.int16", "system.int32", "system.int64", 
        "system.string", "system.object", "system.boolean", "system.void", 
        "system.char", "system.byte", 
        "system.uint16", "system.uint32", "system.uint64", 
        "system.sbyte", 
        "system.single", "system.double", "system.decimal"
    };

    private static bool IsBaseType(string fullName)
    {
        // It is done in this way in CSharpCodeGenerator.GetBaseTypeOutput
        return BaseTypes.Contains(fullName.ToLower(CultureInfo.InvariantCulture).Trim());
    }

    public static string StripNameSpaces(this Type type)
    {
        string fullName = type.FullName;

        if (IsBaseType(fullName))
        {
            return fullName;
        }

        return type.Name;
    }

    public static string StripNameSpaces(this string fullName)
    {
        if (IsBaseType(fullName))
        {
            return fullName;
        }

        return fullName.Split('.').Last();
    }
}

像这样使用它:

mth.Parameters.Add(new CodeParameterDeclarationExpression(param.ParameterType.StripNamespaces(), param.Name)); 

请注意,剥离名称空间有一些缺点:必须确保在CodeDom包含“正确的”名称空间,并且可能有多个类共享同一名称空间。 另一个问题:您无法区分OuterClass.InnerClassNamespace.OuterClass 无法对此进行轻松检查。

您可以使用Type类的Name属性来避免Type完全限定名称。

mth.Parameters.Add(new CodeParameterDeclarationExpression(param.ParameterType.Name, param.Name)); 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM