l'extension de Convertir.ChangeType pour produire des types définis par l'utilisateur sur demande
Compte tenu de la classe:
public class Foo
{
public string Name { get; set; }
}
Est-il possible d'avoir un Foo instance créée à partir d'une chaîne à travers les Convertir.ChangeType:
Type type = typeof(Foo);
object value = "one";
value = System.Convert.ChangeType(value, type);
C'est comment une 3ème partie de l'API est de tenter de reconstruire des objets. Quelqu'un a mentionné, c'est possible avec les opérateurs, mais à partir de ma compréhension qui me permettra de le faire, de ne pas créer l'objet:
Foo foo = new Foo() { Name = "one" };
string fooAsString = foo; //implicit conversion -- no cast needed
Est-il un moyen de créer l'objet de cette façon? Aussi, je ne avoir la capacité de changer le Convertir.ChangeType si il y a une autre façon de le faire.
Mise à jour:
La raison que je demande c'est parce qu'il jette et des une exception:
Invalide cast de 'Système.String' pour
'JibbaJabba+Foo'.
et l'ajout de l'opérateur n'a pas résolu le problème.
Veuillez noter que vous pouvez avoir un opérateur implicite dans les deux sens, mais il est encore un compilateur C# fonction et n'est pas destiné à être utilisé par les déjà-code compilé. Très probablement, vous avez à regarder et à voir que la 3e partie de la bibliothèque vous permet de créer les objets vous-même, peut-être il ya une surcharge qui accepte un
Converter<string, T>
délégué?OriginalL'auteur blu | 2010-10-02
Vous devez vous connecter pour publier un commentaire.
Selon la documentation MSDN:
en Regardant leIConvertible
de l'interface, il a unToType
méthode. Vous pourriez essayer, peut-être? (Disclaimer: je n'ai pas. C'est juste une pensée.)Modifier: Dans votre cas, il semble que vous voulez convertir de un
string
à unFoo
. Depuis lestring
type (évidemment) ne définit pas une conversion àFoo
dans sonIConvertible
mise en œuvre, je crois que vous êtes hors de la chance.Mise à jour: je ne veux pas suggérer que c'est la façon dont vous devriez toujours à l'approche de ce genre de problème, mais...
J'ai pris un coup d'oeil au code pour
Convert.ChangeType
dans Réflecteur. C'est long; je ne vais pas reproduire ici. Mais fondamentalement, c'est faire ce que dit la documentation: il seulement fonctionne si:value
paramètre est une valeur non nulle instance d'un type qui implémenteIConvertible
, ou:value
paramètre et laconversionType
paramètre sont les mêmes (donc:Convert.ChangeType(myFoo, typeof(Foo))
également de travailler, bien qu'il serait assez inutile).Ensuite, il parcourt tous les types pris en charge par
IConvertible
(qui, évidemment, ne comprennent pas les types définis par l'utilisateur) et en fin de compte utiliseToType
comme une solution de repli.Donc, nous avons besoin de regarder le
string
type de mise en œuvre deToType
.Malheureusement, il est malheureux de ligne:
Ce n'
DefaultToType
faire? Exactement la même chose queChangeType
(moins leToType
de secours, évidemment, d'éviter une récursion infinie).Donc, ce n'est tout simplement pas aller travailler.
Si vous êtes absolument liée à cette 3ème partie de la bibliothèque à l'aide de
Convert.ChangeType
derrière les coulisses, je vous recommandons de contacter la bibliothèque du développeur et de leur demander d'étendre leur API, d'une certaine façon qui va vous permettre d'accomplir ce que vous essayez d'accomplir. Quelques possibilités:Converter<string, T>
ouFunc<string, T>
délégué paramètre, tel que suggéré par Ben Voigt dans un commentaire.TypeConverter
paramètreIParser<T>
De toute façon, bonne chance.
Ouais, on sait jamais. Parfois, les docs dévoiler qu'une partie de l'histoire.
OriginalL'auteur Dan Tao
Direct distribution de chaîne ne fonctionne pas comme Dan Tao l'a déjà souligné. Pourriez-vous mettre en place votre propre wrapper pour la chaîne et l'utiliser? Quelque chose comme
Ne sais pas si c'est une bonne idée mais de toute façon..
Ouais, j'ai le même sentiment 🙂
OriginalL'auteur Patko
Un opérateur implicite de ne pas travailler ici? Si Toto est une classe, vous pouvez modifier ensuite j'ai utilisé quelque chose comme cela dans le passé, qui vous permet également de comparer les Foo cas d'une chaîne de caractères.
Edit: Si vous devez utiliser ChangeType alors comme je sais que vous êtes hors de la chance. Si vous pouvez modifier l'API à utiliser un TypeConverter, vous pouvez utiliser quelque chose comme ce qui suit.
Convert.ChangeType
sur une chaîne et passe son type personnalisé comme letype
paramètre une instance de son type personnalisé sera instancié. En d'autres termesConvert.ChangeType
est une avenue qui ce code passer à travers (basé sur l'OP).Je vois votre point de vue. Il n'est pas clair de son commentaire, "d'ailleurs, je ne avoir la capacité de changer le Convertir.ChangeType si il y a une autre façon de le faire." si cela signifie qu'il peut modifier l'API source ou pas.
OriginalL'auteur MattP
Edit:
Ok, alors, si vous essayez de créer un type de Foo de chaîne, vous pouvez utiliser la réflexion:
La mise à jour ne fonctionne pas non plus. La deuxième partie de la réponse ne se rapporte pas à la question.
L'OP spécifiquement veut faire ce travail avec
ChangeType
car il est utilisé par une 3ème partie de la bibliothèque.OriginalL'auteur kofucii