web-dev-qa-db-fra.com

Comment obtenir le type de classe par son nom de classe?

namespace Myspace
{
    public class MyClass
    {
    }
} //This class is in another file.

using Myspace;
static void Main(string[] args)
{
    Regex regexViewModelKey = new Regex(RegularExpr.ViewModelKeyPattern);
    string viewModel = regexViewModelKey.Match(match.Value).Value;
    //Now, vieModel is a string, and its value is "MyClass". So, I only know the class name, this is why I ask this question.

    //Now, I'm only allowed to use the string form of this class name to get its type.
    //I have tyied like this, but its no use.
    Type t = Type.GetType(viewModel);
    //it's return a null.

    //Then I tyied another method like this, but there is an exception when calling Assembly.Load
    Assembly assembly = Assembly.Load("Myspace");
    Type ty = Assembly.GetType("Myspace" + viewModel);
}

J'espère que ma question est claire. Quelqu'un peut-il m'aider.THX Je suis uniquement autorisé à utiliser la forme chaîne de ce nom de classe pour obtenir son type.

thx tout le monde . J'ai résolu cette question par moi-même comme ça.

{
      Type t = Type.GetType(string.Concat(viewModel, ",", "Myspace"));
}
15
Huan Fu

utilisez simplement la fonction typeof (). Le paramètre est juste ce nom de classe. 

Type type = typeof(FIXProtoClientTest);

MSDN sur typeof ()

28
Shen liang

En règle générale, vous n'aurez pratiquement jamais besoin de faire de comparaisons de types, à moins que vous ne fassiez quelque chose avec réflexion ou interfaces. Toutefois:

Si vous connaissez le type avec lequel vous souhaitez le comparer, utilisez l'opérateur is ou as:

if( unknownObject is TypeIKnow ) { // run code here

L'opérateur as effectue un transtypage renvoyant la valeur null s'il échoue plutôt qu'une exception:

TypeIKnow typed = unknownObject as TypeIKnow;

Si vous ne connaissez pas le type et souhaitez simplement obtenir des informations sur le type d'exécution, utilisez la méthode .GetType () :

Type typeInformation = unknownObject.GetType();



     // int is a value type
    int i = 0;
    // Prints True for any value of i
    Console.WriteLine(i.GetType() == typeof(int));

    // string is a sealed reference type
    string s = "Foo";
    // Prints True for any value of s
    Console.WriteLine(s == null || s.GetType() == typeof(string));

    // object is an unsealed reference type
    object o = new FileInfo("C:\\f.txt");
    // Prints False, but could be true for some values of o
    Console.WriteLine(o == null || o.GetType() == typeof(object));

 // Get the type of a specified class.
                Type myType1 = Type.GetType("System.Int32");
                Console.WriteLine("The full name is {0}.", myType1.FullName);
                // Since NoneSuch does not exist in this Assembly, GetType throws a TypeLoadException.
                Type myType2 = Type.GetType("NoneSuch", true);
                Console.WriteLine("The full name is {0}.", myType2.FullName);

    // FileSystemInfo is an abstract type
    FileSystemInfo fsi = new DirectoryInfo("C:\\");
    // Prints False for all non-null values of fsi
    Console.WriteLine(fsi == null || fsi.GetType() == typeof(FileSystemInfo));
2
Backtrack

Votre ligne Type.GetType (modèle) fonctionnera si vous utilisez le nom de classe qualifié complet, y compris son espace de noms. 

De plus, s'il se trouve dans un assembly différent du code qui effectue l'appel, vous devez utiliser Assembly.GetType (typeName) lorsque l'objet Assembly mentionné est une instance de Assembly contenant le type.

0
tker