How to get namespace from object name (as string)

Hi everyone,

I try to write a function to return a namespace based on the name of the input object ( as string).

For the most cases I can use Type.GetType(objName) to get the namespace back.

However, I have seen some special case like

"System.Diagnostics.Debug"

"System.Collections.Generic.List<string>" .... and Type.GetType(objName) just return null.

Are there any way to do this in C#

// Need help

private string GetNameSpace(string objName)

{

Type type = Type.GetType(objName);

if (type != null)

return type.Namespace;

else

{

//Example: input string

// "System.Diagnostics.Debug"

// "System.Collections.Generic.List<Car>"

// Assume the object name is valid and program can compliled

// Need a way to get the namespace for special cases

return "nameSpace";

}

}



Answer this question

How to get namespace from object name (as string)

  • bstockwell

    Hi,

    If we call the method as below,
    str = "System.Diagnostics.Debug"
    t = Type.GetType(str, true, true);

    We will get error as below, because the Type.GetType method will only search the current assembly which called the method.
    System.TypeLoadException: Could not load type 'System.Diagnostics.Debug' from assembly 'TestTraceDebugger, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'.
    at System.RuntimeTypeHandle._GetTypeByName(String name, Boolean throwOnError, Boolean ignoreCase, Boolean reflectionOnly, StackCrawlMark& stackMark, Boolean loadTypeFromPartialName)
    at System.RuntimeTypeHandle.GetTypeByName(String name, Boolean throwOnError, Boolean ignoreCase, Boolean reflectionOnly, StackCrawlMark& stackMark)
    at System.RuntimeType.PrivateGetType(String typeName, Boolean throwOnError, Boolean ignoreCase, Boolean reflectionOnly, StackCrawlMark& stackMark)
    at System.Type.GetType(String typeName, Boolean throwOnError, Boolean ignoreCase)

    So we need to use Assembly.GetType approach to do that.
    Because we did not know which assembly the type may locate, we can enumerate all the assembly in current appdomain.

    static void Main(string[] args)
    {
    string str ="System.Diagnostics.Debug";
    Type t=null;
    Debug.WriteLine("Test"); //This line is necessary, or the System.dll will not loaded, so the "System.Diagnostics.Debug" will not be found.
    try
    {
    Assembly[] myAssemblies = AppDomain.CurrentDomain.GetAssemblies();
    foreach (Assembly myAssembly in myAssemblies)
    {
    Console.WriteLine(myAssembly.CodeBase.ToString());
    t = myAssembly.GetType(str);
    if (null != t)
    break;
    }
    }
    catch (Exception e)
    {
    Console.WriteLine(e.ToString());
    }

    if (null != t)
    Console.WriteLine(t.Namespace.ToString());
    }


    If you still have any concern, please feel free to post here.

    Best regards,
    Peter Huang



  • shelkesanty

    Hi Peter,

    Thanks for you suggestion. It works for "System.Diagnostics.Debug".

    However, type still equals null when I tried generic type like:

    "System.Collections.Generic.List<T>",

    "System.Collections.Generic.List<string>" or

    "System.Collections.Generic.List<anyType>"

    Regards,

    JDang


  • VisualCBuilder

    Hi,

    In addition, if you already know which assemly was the type located.
    i.e. its AssemblyQualifiedName
    You may also try to the code below.

    Type t = Type.GetType("System.Diagnostics.Debug, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089");

    http://msdn2.microsoft.com/en-us/system.type.assemblyqualifiedname.aspx

    If you still have any concern, please feel free to post here.

    Best regards,
    Peter Huang



  • khalidkst

    Hi John,

    For generic class, we have another string because it included the type we will include in the generic.

    You may try to the method below.
    Type classType = Type.GetType("System.Collections.Generic.List`1[System.String]",true);

    Here is a link for your reference.
    http://weblogs.asp.net/lancea/archive/2004/06/01/146202.aspx

    Also to retrieve the full qualified name about the Type, we can run the code below.
    System.Collections.Generic.List<string> sList = new List<string>();
    Console.WriteLine(sList.GetType().AssemblyQualifiedName );

    If you still have any concern, please feel free to post here.

    Best regards,
    Peter Huang



  • How to get namespace from object name (as string)