使用 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.InnerClass
和 Namespace.OuterClass
。对此无法轻松进行检查。
我想使用 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.InnerClass
和 Namespace.OuterClass
。对此无法轻松进行检查。