C# - Jak sprawdzić, czy przestrzeń nazw, klasa lub metoda istnieje w C#?

Mam program w języku C#, Jak mogę sprawdzić w czasie wykonywania, czy istnieje przestrzeń nazw, klasa lub metoda? Ponadto, jak utworzyć instancję klasy używając jej nazwy w postaci ciągu znaków?

Pseudocode:

string @namespace = "MyNameSpace";
string @class = "MyClass";
string method= "MyMEthod";

var y = IsNamespaceExists(namespace);
var x = IsClassExists(@class)? new @class : null; //Check if exists, instantiate if so.
var z = x.IsMethodExists(method);
Author: Sai Kalyan Kumar Akshinthala, 2011-12-14

3 answers

Możesz użyć Type.GetType (string) do odzwierciedlenia klasy. Type posiada metody do odkrywania innych członków, w tym metody, które są dostępne dla tego typu.

Jedna sztuczka polega jednak na tym, że GetType chce mieć nazwę kwalifikowaną do Zgromadzenia. Jeśli używasz tylko samej nazwy klasy, zakłada ona, że odwołujesz się do bieżącego zestawu.

Więc jeśli chcesz znaleźć typ we wszystkich załadowanych składach, możesz zrobić coś takiego (używając LINQ):

var type = (from assembly in AppDomain.CurrentDomain.GetAssemblies()
            from type in assembly.GetTypes()
            where type.Name == className
            select type);

Oczywiście, tam może to być coś więcej niż to, gdzie będziesz chciał zastanowić się nad odwołanymi złożeniami, które mogą nie być jeszcze załadowane, itp.

Jeśli chodzi o określanie przestrzeni nazw, reflection nie eksportuje ich wyraźnie. Zamiast tego musisz zrobić coś w stylu:

var namespaceFound = (from assembly in AppDomain.CurrentDomain.GetAssemblies()
from type in assembly.GetTypes()
where type.Namespace == namespace
select type).Any()

Poskładając to wszystko do kupy, miałbyś coś w stylu:

var type = (from assembly in AppDomain.CurrentDomain.GetAssemblies()
                from type in assembly.GetTypes()
                where type.Name == className && type.GetMethods().Any(m => m.Name == methodName)
                select type).FirstOrDefault();

if (type == null) throw new InvalidOperationException("Valid type not found.");

object instance = Activator.CreateInstance(type);
 40
Author: HackedByChinese,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-12-14 05:23:18

Możesz rozwiązać Typ z ciągu znaków za pomocą typu .Metoda GetType (String). Na przykład:

Type myType = Type.GetType("MyNamespace.MyClass");

Możesz użyć instancji tego typu, aby sprawdzić, czy w typie istnieje jakaś metoda, wywołując metodę GetMethod(String) . Na przykład:

MethodInfo myMethod = myType.GetMethod("MyMethod");

Zarówno GetType, jak i GetMethod zwracają null Jeśli nie znaleziono żadnego typu lub metody dla podanej nazwy, więc możesz sprawdzić, czy twój typ/metoda istnieje, sprawdzając, czy wywołanie metody zwróciło null lub nie.

Wreszcie, możesz utworzyć instancję swojego typu za pomocą aktywatora .CreateInstance (Type) Na przykład:

object instance = Activator.CreateInstance(myType);
 30
Author: MatthewKing,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-12-14 05:01:24

Jedno słowo: odbicie . Poza przestrzeniami nazw, będziesz musiał przetworzyć te z nazw typu.

EDIT: Strike that - dla przestrzeni nazw będziesz musiał użyć tego typu.Właściwość przestrzeni nazw określająca, do której przestrzeni nazw należy każda klasa. (Zobacz HackedByChinese response aby uzyskać więcej informacji).

 2
Author: M.Babcock,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:55:10