Gabriel_ris
Gabriel_ris

Reputation: 11

Modify class variable returned by method

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

Answers (3)

mkysoft
mkysoft

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

David Arno
David Arno

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

serhiyb
serhiyb

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

Related Questions