J'ai le System.Type d'un certain objet mais j'ai besoin de le passer en tant que Type Parameter T à une autre méthode ... est-ce que c'est en quelque sorte possible? Ou suis-je perdu dans la plus grande image là-bas?Obtenir le paramètre de type T à partir d'un System.Type instancié?
Répondre
Ceci n'est pas possible. Si vous y réfléchissez, un paramètre de type est résolu au moment de la compilation, alors que System.Type est résolu par réflexion au moment de l'exécution. Maintenant, après avoir dit que c'est impossible, c'est possible en utilisant la réflexion. Si vous créez la classe avec un reflet, vous pouvez passer un paramètre System.Type en paramètre, mais il vaut sans doute mieux redessiner tout ce que vous essayez de faire.
EDIT: Voici quelques idées pour une refonte.
D'où vient le System.Type? Pourriez-vous le transmettre en tant que paramètre de type lui-même afin qu'il puisse être transmis?
Sinon, pourriez-vous faire un adaptateur qui gère les types connus qui seront utilisés? Peut-être une déclaration de commutateur qui convertit du System.Type au bon type d'appel générique? Tout est plus rapide que la réflexion.
Vous pouvez le faire en utilisant la réflexion. Vous ne voulez pas changer votre conception à la place (pour éviter la reflaction)?
Vous pouvez donc transmettre votre type en tant que paramètre:
DoSomething(yourObject.GetTaype());
Envisagez d'utiliser un autre modèle. Les types génériques sont destinés à être résolus statiquement au moment de la compilation.
Encore, c'est possible. Vous devez recourir à la réflexion:
public class TypeReporter<T> {
public TypeReporter() {
Console.WriteLine("this type is: {0}", typeof(T));
}
// other methods
}
public class StackOverflow694683 {
static void Main() {
string n = "..."; // Pick a type, such as System.String.
Type arg = Type.GetType(n);
Type genericClass = typeof(TypeReporter<>);
Type createdClass = genericClass.MakeGenericType(arg);
// Result is of TypeReporter<T> type. Invoke desired methods.
object result = Activator.CreateInstance(createdClass);
}
}
Ce que vous demandez de faire n'est pas possible dans .Net. Les paramètres de type sont une opération de type compilation dans .Net (C# et VB). Une instance System.Type est une construction d'exécution. Toute interrogation sur le type réel derrière System.Type doit se produire au moment de l'exécution. Ainsi, les solutions ne sont pas compatibles.
Par exemple:
public void DoSomething<T>(T value) {
// Do something with a value of type T
}
public Example1() {
DoSomething(42); // Calls DoSomething<int>
Type t1 = typeof(int);
DoSomething(t1); // Calls DoSomething<Type>
object o1 = 42;
Type t2 = o1.GetType();
DoSomething(???) // No way to call DoSomething<int> here without some
// wild reflection because the call to DoSomething is
// established at compile type where t2 is established
// at runtime
}
Ce que vous faites habituellement est d'avoir la méthode pour surcharge générique spécifiquement pour ce genre d'opérations. E.g .:
Load<T>();
Load(Type type);
C'est ce que je fais habituellement, mais la méthode est une tierce partie et elle accepte seulement SomeMethod
- 1. Obtention d'un System.Type à partir du nom partiel du type
- 2. t-sql udf, obtenir le type d'un paramètre
- 3. comment obtenir la valeur par défaut d'un type si le type est seulement connu comme System.Type?
- 4. Réflexion - Obtenir les paramètres génériques d'une instance System.Type
- 5. obtenir le type T de IEnumerable <T>
- 6. Obtenez le type de paramètre générique
- 7. Comment obtenir l'accès au registre côté serveur à partir de l'objet COM instancié par php?
- 8. VB.NET Get system.type sous-jacent de type nullable
- 9. C# obtenir le type générique <T> donné T
- 10. Comment instancier une instance de type représenté par le paramètre de type à Scala
- 11. Type de paramètre générique
- 12. C# Obtenir le nom du type dérivé à partir de la classe de base interne Classe
- 13. Comment obtenir le paramètre de langue firefox?
- 14. Erreur lors de la création de System.Type à partir de la chaîne "System.Int32"
- 15. Lua: Obtenir le nom littéral du paramètre
- 16. Obtenir des informations EPG à partir de DVB-T
- 17. Comment puis-je obtenir le paramètre Autorisation de numérotation Active Directory à partir de LDAP à l'aide de VBScript?
- 18. objet instanciation du paramètre de type
- 19. Existe-t-il un moyen de trouver le type d'un paramètre template (générique) en Java?
- 20. La conception d'une interface générique nécessite le paramètre type sur le type ou la méthode?
- 21. Demande le type Lua userdata à partir de C
- 22. Comment puis-je convertir un System.Type en sa version nullable?
- 23. Comment obtenir le type de périphérique associé à un fd
- 24. Winsdor enregistrer un type générique avec le paramètre constructeur
- 25. .NET Reflection - Comment obtenir le type "réel" de dehors ParameterInfo
- 26. Méthode la plus efficace pour obtenir le constructeur par défaut d'un type
- 27. ENUM selon le type T
- 28. Comment obtenir le paramètre dans OnActionExecuting?
- 29. Résoudre le type CLR à partir de DataContract.Namespace?
- 30. Comment obtenir Content-Type lors du téléchargement de fichier à partir de flash - est-ce possible?
Pouvez-vous poster votre échantillon de code? –