i have a class named Hacker and i have a class Spy in witch i have to do a method that takes the name(single name) of Hacker class but ass a string "Hacker" do some work and return it as a string and im suppose to get the job done by this code in my main method:
Spy spy = new Spy();
string result = spy.AnalyzeAccessModifiers("Hacker");
Console.WriteLine(result);
In my AnalyzeAccessModifiers method I tried:
public string AnalyzeAccessModifiers(string className)
{
// i need to get some job done with:
Type type = Type.GetType(classname);//but it need the fully qualified name for that.
// so i tried:
Type type = typeof(className); // but it does not work with string...
}
is there any way this to be done when i only have the name as a string ...the only way i can think off is by using the actual class name as a type not as a string but that is not in the description of my task...
Sadly Type.GetType(string)
is quite finicky about the details it requires before it will give you the result. If the type you're looking for is in current executing assembly (or mscorlib
/System.Private.CoreLib
) then a fully specified name (including namespace) will get the result. If it's in a different assembly then you need to specify the assembly name.
Type type = null;
// Fails
type = Type.GetType("String");
// Succeeds from core library
type = Type.GetType("System.String");
// Fails (loading from a different assembly)
type = Type.GetType("System.Text.Json.JsonSerializer");
// Succeeds (.NET 6.0)
type = Type.GetType("System.Text.Json.JsonSerializer, System.Text.Json");
Which is all well and good until you're trying to find a type that you have exactly one piece of information about: the class name. Without namespace and assembly name you're stuck with enumerating every type until you find what you're looking for...
static Type? TypeFromName(string name) =>
// All loaded assemblies
AppDomain.CurrentDomain.GetAssemblies()
// All types in loaded assemblies
.SelectMany(asm => asm.GetTypes())
// Return first match
.FirstOrDefault(type => type.Name == name);
Simple, yes. Fast? Not even remotely. But you only need to do the search once and cache the results for later use.