Given the class:
public class Foo { public string Name { get; set; } }
Is it possible to have a Foo instance created from a string through Convert.ChangeType:
Type type = typeof(Foo); object value = "one"; value = System.Convert.ChangeType(value, type);
This is how a 3rd party API is attempting to rebuild objects. Someone mentioned this is possible with implicit operators, but from my understanding that will let me do the following, not create the object:
Foo foo = new Foo() { Name = "one" }; string fooAsString = foo; // implicit conversion -- no cast needed
Is there a way to create the object this way? Also, I do have the ability to change the Convert.ChangeType if there is another way to do this.
Update: The reason I am asking is because it throws and exception:
Invalid cast from 'System.String' to 'JibbaJabba+Foo'.
and adding the operator did not resolve the issue.
ChangeType(Object, TypeCode) is a general-purpose conversion method that converts the object specified by value to a predefined type specified by typeCode . The value parameter can be an object of any type.
Try: Type type = Type. GetType(inputString); //target type object o = Activator.
Type conversion creates a value in a new type that is equivalent to the value of an old type, but does not necessarily preserve the identity (or exact value) of the original object. . NET automatically supports the following conversions: Conversion from a derived class to a base class.
Use the operator and implicit or explicit keywords to define an implicit or explicit conversion, respectively. The type that defines a conversion must be either a source type or a target type of that conversion. A conversion between two user-defined types can be defined in either of the two types.
According to the MSDN documentation:
For the conversion to succeed, value must implement the IConvertible interface, because the method simply wraps a call to an appropriate IConvertible method. The method requires that conversion of value to conversionType be supported.
Looking at the IConvertible
interface, it has a ToType
method. You could try that, maybe? (Disclaimer: I haven't. It's just a thought.)
Edit: In your case, it seems that you want to convert from a string
to a Foo
. Since the string
type (obviously) does not define a conversion to Foo
in its IConvertible
implementation, I believe you're out of luck.
Update: I don't want to suggest that this is how you should always approach this sort of problem, but...
I took a look at the code for Convert.ChangeType
in Reflector. It's long; I won't reproduce it here. But basically it's doing as the documentation says: it only works if:
value
parameter is a non-null instance of a type that implements IConvertible
, or:value
parameter and the conversionType
parameter are the same (so: Convert.ChangeType(myFoo, typeof(Foo))
would also work, though it'd be pretty useless).Then, it cycles through all the types supported by IConvertible
(which obviously does not include any user-defined types) and ultimately uses ToType
as a fallback.
So, we need to look at the string
type's implementation of ToType
.
Sadly, it is one unfortunate line:
return Convert.DefaultToType(this, type, provider);
What does DefaultToType
do? Exactly the same thing as ChangeType
(minus the ToType
fallback, obviously to avoid infinite recursion).
So this just simply isn't going to work.
If you're absolutely tied to this 3rd party library that's using Convert.ChangeType
behind the scenes, I would recommend contacting the library's developer and asking them to extend their API in some way that will allow you to accomplish what you're trying to accomplish. Some possiblities might be:
Converter<string, T>
or Func<string, T>
delegate parameter, as suggested by Ben Voigt in a comment.TypeConverter
parameterIParser<T>
Anyway, best of luck.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With