76 votes

Convertir une variable en dactylographie uniquement connue au moment de l'exécution?

 foreach (var filter in filters)
{
    var filterType = typeof(Filters);
    var method = filterType.GetMethod(filter, BindingFlags.IgnoreCase | BindingFlags.Public | BindingFlags.Static);
    if (method != null)
    {
        var parameters = method.GetParameters();
        Type paramType = parameters[0].GetType();
        value = (string)method.Invoke(null, new[] { value });
    }
}
 

Comment puis-je lancer value à paramType ? value est un string , paramType sera probablement juste un type basique comme int , string , ou peut-être float . Je suis prêt à faire une exception si aucune conversion n'est possible.

76voto

Aliostad Points 47792

Les types que vous utilisez implémentent tous IConvertible . En tant que tel, vous pouvez utiliser ChangeType .

  value = Convert.ChangeType(method.Invoke(null, new[] { value }), paramType);
 

14voto

Jakob Flygare Points 71

Vous pourriez aller dynamique; par exemple:

 using System;

namespace TypeCaster
{
    class Program
    {
        internal static void Main(string[] args)
        {
            Parent p = new Parent() { name = "I am the parent", type = "TypeCaster.ChildA" };
            dynamic a = Convert.ChangeType(new ChildA(p.name), Type.GetType(p.type));
            Console.WriteLine(a.Name);

            p.type = "TypeCaster.ChildB";
            dynamic b = Convert.ChangeType(new ChildB(p.name), Type.GetType(p.type));
            Console.WriteLine(b.Name);
        }
    }

    internal class Parent
    {
        internal string type { get; set; }
        internal string name { get; set; }

        internal Parent() { }
    }

    internal class ChildA : Parent
    {
        internal ChildA(string name)
        {
            base.name = name + " in A";
        }

        public string Name
        {
            get { return base.name; }
        }
    }

    internal class ChildB : Parent
    {
        internal ChildB(string name)
        {
            base.name = name + " in B";
        }

        public string Name
        {
            get { return base.name; }
        }
    }
}
 

1voto

Dekker500 Points 596

Très proche d'une question existante. Je pense que cela va vous aider.

Il ya plusieurs façons que vous pouvez créer un objet d'un certain type à la volée, on est:

// determine type here
var type = typeof(MyClass);

// create an object of the type
var obj = (MyClass)Activator.CreateInstance(type);

Et vous obtiendrez une instance de Maclasse en obj.

Une autre méthode consiste à utiliser la réflexion:

// get type information
var type = typeof(MyClass);

// get public constructors
var ctors = type.GetConstructors(BindingFlags.Public);

// invoke the first public constructor with no parameters.
var obj = ctors[0].Invoke(new object[] { });

Et à partir de l'une des ConstructorInfo retourné, vous pouvez "Invoke()" avec des arguments et récupérer une instance de la classe comme si vous avez déjà utilisé un opérateur "new".

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X