Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何获取类型的完整C#声明?_C#_.net_Reflection_Types - Fatal编程技术网

如何获取类型的完整C#声明?

如何获取类型的完整C#声明?,c#,.net,reflection,types,C#,.net,Reflection,Types,我正试图编写一个函数来为类型对象生成完整的C#声明。我当前的方法涉及对类型对象执行非常手动和特定的逻辑 是否有一些内置到.Net的方法来生成此声明 以本课程为例: namespace My.Code.Here { public class Class1<> { public enum Enum1 { } } } 名称空间My.code.Here { 公共班级1 { 公共枚举Enum1{} } } 当对typeof(Class1.Enum1)调用函数(

我正试图编写一个函数来为类型对象生成完整的C#声明。我当前的方法涉及对类型对象执行非常手动和特定的逻辑

是否有一些内置到.Net的方法来生成此声明

以本课程为例:

namespace My.Code.Here
{
   public class Class1<>
   {
      public enum Enum1 { }
   }
}
名称空间My.code.Here
{
公共班级1
{
公共枚举Enum1{}
}
}

当对typeof(Class1.Enum1)调用函数(我们称之为getCSharpDec)时,它将返回“My.Code.Here.Class1.Enum1”。

这里有几个问题

  • C#和
    类型
    以不同的方式命名嵌套类型
  • C#和
    类型
    以不同的方式命名泛型类型
顺便说一句,
Class1.Enum1
不是封闭类型,但这不应该是一个问题

(编辑)

这非常接近-它仍然保留类型的外部泛型,不过:

static void Main()
{
    Type t = typeof(My.Code.Here.Class1<>.Enum1);
    string s = GetCSharpName(t); // My.Code.Here.Class1<T>.Enum1<T>
}

public static string GetCSharpName<T>()
{
    return GetCSharpName(typeof(T));
}
public static string GetCSharpName(Type type)
{
    StringBuilder sb = new StringBuilder();
    sb.Insert(0, GetCSharpTypeName(type));
    while (type.IsNested)
    {
        type = type.DeclaringType;
        sb.Insert(0, GetCSharpTypeName(type) + ".");

    }
    if(!string.IsNullOrEmpty(type.Namespace)) {
        sb.Insert(0, type.Namespace + ".");
    }
    return sb.ToString();
}
private static string GetCSharpTypeName(Type type)
{

    if (type.IsGenericTypeDefinition || type.IsGenericType)
    {
        StringBuilder sb = new StringBuilder();
        int cut = type.Name.IndexOf('`');
        sb.Append(cut > 0 ? type.Name.Substring(0, cut) : type.Name);

        Type[] genArgs = type.GetGenericArguments();
        if (genArgs.Length > 0)
        {
            sb.Append('<');
            for (int i = 0; i < genArgs.Length; i++)
            {
                sb.Append(GetCSharpTypeName(genArgs[i]));
                if (i > 0) sb.Append(',');
            }
            sb.Append('>');
        }
        return sb.ToString();
    }
    else
    {
        return type.Name;
    }
}
static void Main()
{
Type t=typeof(My.Code.Here.Class1.Enum1);
字符串s=GetCSharpName(t);//My.Code.Here.Class1.Enum1
}
公共静态字符串GetCSharpName()
{
返回GetCSharpName(typeof(T));
}
公共静态字符串GetCSharpName(类型)
{
StringBuilder sb=新的StringBuilder();
sb.插入(0,GetCSharpTypeName(类型));
while(type.IsNested)
{
type=type.DeclaringType;
sb.插入(0,GetCSharpTypeName(type)+“);
}
如果(!string.IsNullOrEmpty(type.Namespace)){
sb.插入(0,类型.名称空间+”);
}
使某人返回字符串();
}
私有静态字符串GetCSharpTypeName(类型)
{
if(type.IsGenericTypeDefinition | | type.IsGenericType)
{
StringBuilder sb=新的StringBuilder();
int cut=type.Name.IndexOf('`');
sb.Append(cut>0?type.Name.Substring(0,cut):type.Name);
Type[]genArgs=Type.GetGenericArguments();
如果(genArgs.Length>0)
{
某人附加(“”);
}
使某人返回字符串();
}
其他的
{
返回类型.名称;
}
}

这里有几个问题

  • C#和
    类型
    以不同的方式命名嵌套类型
  • C#和
    类型
    以不同的方式命名泛型类型
顺便说一句,
Class1.Enum1
不是封闭类型,但这不应该是一个问题

(编辑)

这非常接近-它仍然保留类型的外部泛型,不过:

static void Main()
{
    Type t = typeof(My.Code.Here.Class1<>.Enum1);
    string s = GetCSharpName(t); // My.Code.Here.Class1<T>.Enum1<T>
}

public static string GetCSharpName<T>()
{
    return GetCSharpName(typeof(T));
}
public static string GetCSharpName(Type type)
{
    StringBuilder sb = new StringBuilder();
    sb.Insert(0, GetCSharpTypeName(type));
    while (type.IsNested)
    {
        type = type.DeclaringType;
        sb.Insert(0, GetCSharpTypeName(type) + ".");

    }
    if(!string.IsNullOrEmpty(type.Namespace)) {
        sb.Insert(0, type.Namespace + ".");
    }
    return sb.ToString();
}
private static string GetCSharpTypeName(Type type)
{

    if (type.IsGenericTypeDefinition || type.IsGenericType)
    {
        StringBuilder sb = new StringBuilder();
        int cut = type.Name.IndexOf('`');
        sb.Append(cut > 0 ? type.Name.Substring(0, cut) : type.Name);

        Type[] genArgs = type.GetGenericArguments();
        if (genArgs.Length > 0)
        {
            sb.Append('<');
            for (int i = 0; i < genArgs.Length; i++)
            {
                sb.Append(GetCSharpTypeName(genArgs[i]));
                if (i > 0) sb.Append(',');
            }
            sb.Append('>');
        }
        return sb.ToString();
    }
    else
    {
        return type.Name;
    }
}
static void Main()
{
Type t=typeof(My.Code.Here.Class1.Enum1);
字符串s=GetCSharpName(t);//My.Code.Here.Class1.Enum1
}
公共静态字符串GetCSharpName()
{
返回GetCSharpName(typeof(T));
}
公共静态字符串GetCSharpName(类型)
{
StringBuilder sb=新的StringBuilder();
sb.插入(0,GetCSharpTypeName(类型));
while(type.IsNested)
{
type=type.DeclaringType;
sb.插入(0,GetCSharpTypeName(type)+“);
}
如果(!string.IsNullOrEmpty(type.Namespace)){
sb.插入(0,类型.名称空间+”);
}
使某人返回字符串();
}
私有静态字符串GetCSharpTypeName(类型)
{
if(type.IsGenericTypeDefinition | | type.IsGenericType)
{
StringBuilder sb=新的StringBuilder();
int cut=type.Name.IndexOf('`');
sb.Append(cut>0?type.Name.Substring(0,cut):type.Name);
Type[]genArgs=Type.GetGenericArguments();
如果(genArgs.Length>0)
{
某人附加(“”);
}
使某人返回字符串();
}
其他的
{
返回类型.名称;
}
}

你的意思是你想要
类型的(Class1.Enum1).FullName


请注意,正如Marc所指出的,如果您确实需要指定的格式,那么它给您的名称可能不完全是您想要的。

您的意思是您想要类似于
typeof(Class1.Enum1).FullName的名称吗


请注意,正如Marc所指出的,如果您需要指定的格式,那么它给您的名称可能不完全是您想要的。

就是您要找的。

就是您要找的。

此代码应该适用于嵌套的泛型类型(例如
Foo.Bar

public静态字符串GetCSharpTypeName(此类型为bool getFullName)
{
StringBuilder sb=新的StringBuilder();
if(getFullName&!string.IsNullOrEmpty(type.Namespace))
{
sb.Append(type.Namespace);
某人加上(“.”);
}
AppendCSharpTypeName(sb,type,getFullName);
使某人返回字符串();
}
私有静态无效AppendCSharpTypeName
(StringBuilder sb,类型类型,布尔全参数名称)
{
字符串typeName=type.Name;
类型declaringType=类型.declaringType;
int declaringTypeArgumentCount=0;
if(type.IsNested)
{
if(declaringType.IsGenericTypeDefinition)
{
declaringTypeArgumentCount=
declaringType.GetGenericArguments().Length;
declaringType=declaringType.MakeGenericType(
type.getGenericaArguments().Take(declaringTypeArgumentCount)
.ToArray());
}
附录SharpTypeName(sb,declaringType,FullParameterName);
某人加上(“.”);
}
Type[]genericalarguments=Type.getgenericalarguments()
.Skip(declaringTypeArgumentCount).ToArray();
综合指数;
if((type.IsGenericTypeDefinition | | type.IsGenericType)
&&((stopIndex=type.Name.IndexOf('`'))>0))
{
sb.Append(typeName.Substring(0,stopIndex));
字符串[]genericArgumentNames=genericArguments
.Select(t=>GetCSharpTypeName(t,fullParameterNames)).ToArray();
如果(genericArgumentNames.Length>0)
sb.AppendFormat(“,string.Join(“,”,genericalargumentnames));
}
其他的
{
sb.Append(typeName);
}
}

此代码应适用于嵌套的泛型类型(例如
Foo.Bar

public静态字符串GetCSharpTypeName(此类型为bool getFul