At run-time, I don't know what type of variable v1
is. For this reason, I wrote many if else
statements:
if (v1 is ShellProperty<int?>) { v2 = (v1 as ShellProperty<int?>).Value; } else if (v1 is ShellProperty<uint?>) { v2 = (v1 as ShellProperty<uint?>).Value; } else if (v1 is ShellProperty<string>) { v2 = (v1 as ShellProperty<string>).Value; } else if (v1 is ShellProperty<object>) { v2 = (v1 as ShellProperty<object>).Value; }
The only difference is in ShellProperty<AnyType>
.
So instead of writing this with a lot of if else
statements, I decided to use reflection to get the property type at run-time:
Type t1 = v1.GetType().GetProperty("Value").PropertyType; dynamic v2 = (v1 as ShellProperty<t1>).Value;
This code gets the PropertyType
of v1
and assigns it to the local variable t1
, but after that, my compiler says that:
t1 is a variable but is used like a type
So it does not allow me to write t1
inside ShellProperty<>
.
Please tell me how to solve this problem and how to get more compact code than what I have. Do I need to create a new class?
You were very close, you were just missing a call to MakeGenericType
.
I believe your code would look like the following:
Type t1 = v1.GetType().GetProperty("Value").PropertyType; var shellPropertyType = typeof(ShellProperty<>); var specificShellPropertyType = shellPropertyType.MakeGenericType(t1); dynamic v2 = specificShellPropertyType.GetProperty("Value").GetValue(v1, null);
Edit: As @PetSerAl pointed out I added some layers of indirection that were unnecessary. Sorry OP, you probably want a one liner like:
dynamic v2 = v1.GetType().GetProperty("Value").GetValue(v1, null);
For generics, you have to create them dynamically.
MethodInfo method = typeof(Sample).GetMethod("GenericMethod"); MethodInfo generic = method.MakeGenericMethod(myType); generic.Invoke(this, null);
To create a generic object, you can
var type = typeof(ShellProperty<>).MakeGenericType(typeof(SomeObject)); var v2 = Activator.CreateInstance(type);
Please refer to Initializing a Generic variable from a C# Type Variable
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