使用 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));

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

例如

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

提前致谢

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

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

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 中包含 "right" 命名空间,并且您可以有多个 类 共享相同的命名空间.其他问题:无法区分 OuterClass.InnerClassNamespace.OuterClass。对此无法轻松进行检查。