Leo Vo
Leo Vo

Reputation: 10330

How to update value of data type in C#

I all, my codes:

int a = 1;
int b = 2;
enum eType
{
    A,
    B
}

I have function UpdateValue to update value of a or b based on passed parameter eType:

void UpdateValue(eType type, int value)
{
switch(type)
{
   case eType.A:
      a = value;
      break;
   case eType.B:
      b = value;
      break;
}
}

And I also have function GetValue to get value of a or b based on passed parameter eType

    int GetValue(eType type)
    {
    int result = 0;
    switch(type)
    {
        case eType.A:
          result  = a;
          break;
        case eType.B:
          result  = b;
          break;
    }
    return result;
    }

This solution is very bad if I have a lot of items in enum eType. I don't like must enumurate the list of items in eType. So I have a new solution: I create a dictionary:

Dictionary<eType, int> dict = new Dictionary<eType, int>();
dict[eType.A] =a;
dict[eType.B] =b;

I easy to get value of a or b from dict and eType. Example: to get value of a, I call dict[eType.A]. But how I can update value of a or b based dict and eType.

For example if I have dict[eType.A] containing the value 10

How do I set the variable a to 10.

(I want map a to eType.A, and map b to eType.B in dict. I can easy to update value of a and b from dict. I can change value of a using dict. How to do this.)

I'm using .NET 4.0.

Upvotes: 0

Views: 508

Answers (6)

Amit Gupta
Amit Gupta

Reputation: 577

You mean if I have enum for say A to Z then I would also have 26 variables from a to z and they have to be updated depending upon the value of enum.

Well this is not possible at all with the dictionary.

Reflection can be useful. If all those variables u wanted to update are fields of a class.

Upvotes: 0

SirViver
SirViver

Reputation: 2441

If you have no control over the variables that need to be set (the primary solution would otherwise actually be to replace the variables with the dictionary itself), then I think reflection is the only way to automate this behavior at all.

A possible solution for the link between the variable and enum value would be to create a custom attribute that you can then attach to the enum values, like so:

[AttributeUsage(AttributeTargets.All, Inherited = false, AllowMultiple = false)]
sealed class MemberBindingAttribute : Attribute
{
    readonly string memberName;

    public MemberBindingAttribute(string memberName)
    {
        this.memberName = memberName;
    }

    public string MemberName
    {
        get { return memberName; }
    }
}

enum eType
{
    [MemberBinding("a")]
    A,
    [MemberBinding("b")]
    B
}

And then in the UpdateValue() method query these attributes, retrieve the FieldInfo (or PropertyInfo) for the corresponding member and set the value dynamically.

Note that a reflection based solution does come with a performance cost, however.

Upvotes: 1

August Karlstrom
August Karlstrom

Reputation: 11377

Why not use the dictionary as your global variable and use string keys instead

Upvotes: 0

elsni
elsni

Reputation: 2053

Take a look at generics, you can define a list of eType as the key type and int as the value type:

List<etype,int> myList = new List<etype,int>();

myList contains methods to do what you want.

Upvotes: -1

Rob Windsor
Rob Windsor

Reputation: 6859

You have the right idea. Here's some code that creates a dictionary and reads and updates it. I hope this will help.

var dict = new Dictionary<string, int>();
dict.Add("a", 1);
dict.Add("b", 2);
var x = dict["a"];  // 1
dict["a"] = 10;
var y = dict["a"];  // 10

Upvotes: 1

Marco
Marco

Reputation: 57573

You could try this:

enum eType: int
{
    A=0,
    B=1
    //etc...
}
int count = Enum.GetValues(typeof(eType)).Length;
int[] values = new int[count];

Then you can use values[(int)eType] both to get and set, where your variable a is values[0] and variable b is values[1]. This array can be as long as you please and you should'n add code, just the entry in eType enum...
Just an idea to work with...

Upvotes: 1

Related Questions