Reputation: 11
I'm starting to learn C# and I'm stuck with a little problem. I don't know if there's a solution for what I want to do or I have to do it in a different way. Anyway, I'm trying to modify the value of a class variable returned by a method. The code below shows more or less what I want to do.
public Class AClass
{
private SomeClass A;
private SomeClass B;
private SomeClass C;
private SomeClass D;
private enum SomeEnum {A, B, C, D};
private void SomeMethod(SomeEnum theEnum, SomeClass theNewValue){
SomeClass oldValue = GetSomeClass(theEnum);
oldValue = theNewValue;
}
private SomeClass GetSomeClass (SomeEnum theEnum){
switch(theEnum){
case A:
return A;
case B:
return B;
case C:
return C;
case D:
return D;
}
return null;
}
}
Do you guys have any solution or alternative?
Upvotes: 0
Views: 151
Reputation: 5758
public interface ISomeClass
{
/// <summary>
/// eample class method
/// </summary>
/// <returns></returns>
string doSomething();
}
public class SomeClassA : ISomeClass
{
public string doSomething()
{
return "A";
}
}
public class SomeClassB : ISomeClass
{
public string doSomething()
{
return "B";
}
}
public class SomeClassC : ISomeClass
{
public string doSomething()
{
return "C";
}
}
public class SomeClassD : ISomeClass
{
public string doSomething()
{
return "D";
}
}
public class Class1
{
private SomeClassA A;
private SomeClassB B;
private SomeClassC C;
private SomeClassD D;
private enum SomeEnum { A, B, C, D };
private void SomeMethod(SomeEnum theEnum, ISomeClass theNewValue)
{
ISomeClass oldValue = GetSomeClass(theEnum);
oldValue = theNewValue;
}
private ISomeClass GetSomeClass(SomeEnum theEnum)
{
switch (theEnum)
{
case SomeEnum.A:
return A;
case SomeEnum.B:
return B;
case SomeEnum.C:
return C;
case SomeEnum.D:
return D;
}
return null;
}
}
Also you can use dynamic class creation for not using switch.
Upvotes: 0
Reputation: 43254
You are almost there. You just need to directly overwrite A, B, C or D:
public Class AClass
{
private SomeClass A;
private SomeClass B;
private SomeClass C;
private SomeClass D;
private enum SomeEnum {A, B, C, D};
public void UpdateInstance (SomeEnum theEnum, SomeClass newClass)
{
switch(theEnum)
{
case SomeEnum.A:
A = newClass;
break;
case SomeEnum.B:
B = newClass;
break;
case SomeEnum.C:
C = newClass;
break;
case SomeEnum.D:
D = newClass;
break;
}
}
}
The switch statement is ugly though and can only grow as the complexity of the code does. Better to replace it with a dictionary of functions:
private readonly Dictionary<SomeEnum, Action<SomeClass>> instanceUpdaters =
new Dictionary<SomeEnum, Action<SomeClass>>
{
{ SomeEnum.A, x => A = x },
{ SomeEnum.B, x => B = x },
{ SomeEnum.C, x => C = x },
{ SomeEnum.D, x => D = x }
};
public void UpdateInstance (SomeEnum theEnum, SomeClass newClass)
{
instanceUpdaters[theEnum](newClass);
}
Upvotes: 2
Reputation: 4833
One possible ways is to go with reflection:
private SomeClass GetSomeClass(SomeEnum theEnum)
{
return (SomeClass)GetType().GetField(theEnum.ToString(), BindingFlags.NonPublic | BindingFlags.Instance).GetValue(this);
}
Upvotes: -1