Reflection and Inheritance question.

F

Frank O'Hara

I'm new to reflection and would like to know if what I want to do is
possible. So far I haven't seem much value to reflection (for my
needs) but that could be the result of not using it properly, or
perhaps my architecture is inherently flawed.

I have the following:

class baseClass
{
protected object _sharedProperty;

public new baseClass(){}

public object Shared
{
get {return _sharedProperty;}
set {_ sharedProperty = value;}
}

public void SharedMethod()
{
// do something
}
}


class classA : baseClass
{
private object _property1;

public new classA(){}

public object Property1
{
get {return _ property1;}
set {_ property1 = value;}
}
}

class classB : baseClass
{
private object _property2;

public new classB(){}

public object Property2
{
get {return _ property2;}
set {_ property2= value;}
}
}

public static void Test(string className,object propertyValue)
{
Type runtimeClass = Type.GetType(className);

if(((int)myEnum.value1 & runtimeClass.Shared) != 0)
{
System.Reflection.PropertyInfo myProperty =
runtimeClass.GetProperty("Property1");
myProperty.SetValue(runtimeClass,propertyValue,null); <- fails
here
}
if(((int)myEnum.value2 & runtimeClass.Shared) != 0)
{
System.Reflection.PropertyInfo myProperty=
runtimeClass.GetProperty("Property2");
myProperty.SetValue(runtimeClass,propertyValue,null); <- fails
here
}
}

So, basically both ClassA and ClassB inherit from baseClass. They
obviously share properties/methods but also have their own.

Based on certain conditions I want to set a property value of a class
(if it exists - I'm not testing for it in the code provided but plan
on it) without knowing which class until run-time. The class that I
want to instantiate will be only known to the procedure as a string
value.

I'd like to be able to dynamically declare a variable as type
"className" at run-time based on what the string value is passed in
(for the sake of example say that the string being passed in IS the
fully qualified name of the class. I then want to be able to access
and enter property values for the particular class.

But the problem I'm having is that when I try to set my property value
the first argument of the SetValue expects an instance of an object
with the type equal to that which I'm trying to set (which I think is
kinda dumb given that if I knew it I would probably just instantiate
it and set the properly directly). Anyway, clearly I don't know what
this object is supposed to be so I don't know how to get past this
exception.

Does anyone have any thoughts? What I'd love to do is something along
these lines (pseudo-code):

public static void Test(string className,object propertyValue)
{
baseClass runtimeClass = new baseClass();

if(((int)myEnum.value1 & runtimeClass.Shared) != 0)
{
((className)runtimeClass).Property1 = propertyValue;
}
if(((int) myEnum.value2 & runtimeClass.Shared) != 0)
{
((className)runtimeClass).Property2 = propertyValue;
}

runtimeClass.SharedMethod();
}

What I don't want is the following because this can and will get quite
enormous given the number of properties and flag values I have:

public static void Test(string className,object propertyValue)
{
baseClass runtimeClass = new baseClass();

if(((int)myEnum.value1 & runtimeClass.Shared) != 0)
{
if (className == "ClassA")
{
((ClassA)runtimeClass).Property1 = propertyValue;
}
if (className == "ClassC") <-- assume this class also inherits from
baseClass
{
((ClassC)runtimeClass).Property1 = propertyValue;
}
}
if(((int) myEnum.value2 & runtimeClass.Shared) != 0)
{
if (className == "ClassB")
{
((ClassB)runtimeClass).Property2 = propertyValue;
}
if (className == "ClassC") <-- assume this class also inherits from
baseClass
{
((ClassC)runtimeClass).Property2 = propertyValue;
}
}

runtimeClass.SharedMethod();
}

Thanks,
Frank
 
J

Jon Skeet [C# MVP]

I'm new to reflection and would like to know if what I want to do is
possible. So far I haven't seem much value to reflection (for my
needs) but that could be the result of not using it properly, or
perhaps my architecture is inherently flawed.

But the problem I'm having is that when I try to set my property value
the first argument of the SetValue expects an instance of an object
with the type equal to that which I'm trying to set (which I think is
kinda dumb given that if I knew it I would probably just instantiate
it and set the properly directly). Anyway, clearly I don't know what
this object is supposed to be so I don't know how to get past this
exception.

It's the object you're trying to set the property on. In this case,
runtimeClass, but you can't create a new instance of *baseClass*, you
have to create an instance of the derived class, e.g. with
Activator.CreateInstance.

Jon
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Top