İlginizi Çekebilir
  1. Ana Sayfa
  2. C Sharp

C# String ile Değişkene Erişmek

C# String ile Değişkene Erişmek
C# String ile Değişkene Erişmek
+ - 0

Merhaba, bu yazımda C# String ile Değişkene Erişmek konusundan bahsedeceğim. Hiç string bir ifade kullanarak bir değişkene ulaşmak ve onun değerini almak istediniz mi? Örneğin kullanıcının textbox’a yazdığı ifadeyi kullanarak var olan değişkene ulaşmak yada bir döngü ile bir sınıf içindeki değişkenin değerini alma ihtiyacınız oldu mu? Bu yazıda işte bundan bahsedeceğim.

Burada yapacağımız işlemler System.Reflection adlı namespace içerisinde yer almaktadır.

C# String ile Değişkene Erişmek

Diyelim ki veri tabanındaki bir tablodaki bir kolondaki değerler sizin projenizdeki değişkenler olsun. Diğer kolonda da o değişkenlere yazılması gereken veriler olsun. 1. kolondaki ifadelerle sınıfınızdaki gerçek değişkenleri ele almak ve 2. kolondaki değerleri de bulduğunuz değişkenlere yazmanız gerekiyor.

Normal şartlarda değerleri aşağıdaki gibi tek tek değişkenlere yazmanız gerekir değil mi?

MyResource.POWER = 500;
MyResource.IRON_BEAM = 456;
MyResource.IRON_INGOT = 656;
MyResource.IRON_ORE = 55;
MyResource.COPPER_INGOT = 50550;
MyResource.COPPER_ORE = 54400;
MyResource.COPPER_PLATE = 50450;
MyResource.COPPER_ROD = 504560;
MyResource.IRON_PLATE = 789;
MyResource.IRON_ROD = 456;
MyResource.COAL = 504530;
MyResource.COIL = 245;

Peki yüzlerce olduğunu düşünelim. O zaman ne yapmamız gerekiyor?. Kodlar bu şekilde uzayıp gidecek mi? Cevap Hayır!

Şimdi bir string ifade kullanarak bir değişkene nasıl erişeceğimizi göreceğiz.

            object ob = new MyResource();
            var typ = typeof(MyResource);
            var prop = typ.GetProperty("bulmak_istedigimiz_değiskenin_tam_adi");
            var propVal = prop.GetValue(ob, null);

Yukarıdaki kodları açıklayayım.

  1. Hangi sınıfta arama yapacağımızı belirtiyoruz. Burada benim arama yapmak istediğim sınıf MyResource adlı sınıftır.  Ve bu sınıfı bir objeye atıyoruz.
  2. typeof ile objemizin tam olarak tipini buluyoruz ve typ’e atamasını yapıyoruz.
  3. typ üzerinden GetProperty metodunu kullanarak, parametre olarak verdiğimiz property’i alıyoruz.
  4. son olarak da GetValue ile property’nin değerini alıyoruz.
    1. SetValue ile de değişkenin değerini değiştirebiliyoruz. O zaman da ek bir parametre daha alıyor.

Buradaki örneği Prop (Property) üzerinden verdim çünkü projemde property üzerinde kullandım.

Property ne derseniz işte bu;

 public int MyProperty { get; set; }

Property özellik olarak geçiyor ama tabi değişken olarak kullanabiliyoruz. Bu işlemi yaptığım projemde ise değişkenler şu şekilde… Projeyi sonuna kadar götürseydim bu değişkenlerden yüzlerce olacaktı. En azından yüzden fazla…

 class MyResource
    {
        private static double _POWER = 0;
        public static double POWER
        {
            get { return _POWER; }
            set { _POWER = value; }
        }
        private static double _COAL = 0;
        public static double COAL
        {
            get { return _COAL; }
            set { _COAL = value; }
        }
        private static double _IRON_ORE = 0;
        public static double IRON_ORE
        {
            get { return _IRON_ORE; }
            set { _IRON_ORE = value; }
        }
        private static double _IRON_INGOT = 0;
        public static double IRON_INGOT
        {
            get { return _IRON_INGOT; }
            set { _IRON_INGOT = value; }
        }
        private static double _IRON_PLATE = 0;
        public static double IRON_PLATE
        {
            get { return _IRON_PLATE; }
            set { _IRON_PLATE = value; }
        }
        private static double _IRON_BEAM = 0;
        public static double IRON_BEAM
        {
            get { return _IRON_BEAM; }
            set { _IRON_BEAM = value; }
        }
        private static double _COPPER_ORE = 0;
        public static double COPPER_ORE
        {
            get { return _COPPER_ORE; }
            set { _COPPER_ORE = value; }
        }
        private static double _COPPER_INGOT = 0;
        public static double COPPER_INGOT
        {
            get { return _COPPER_INGOT; }
            set { _COPPER_INGOT = value; }
        }
        private static double _CONDUCTING_WIRE = 0;
        public static double CONDUCTING_WIRE
        {
            get { return _CONDUCTING_WIRE; }
            set { _CONDUCTING_WIRE = value; }
        }
        private static double _COPPER_ROD = 0;
        public static double COPPER_ROD
        {
            get { return _COPPER_ROD; }
            set { _COPPER_ROD = value; }
        }
        private static double _IRON_ROD = 0;
        public static double IRON_ROD
        {
            get { return _IRON_ROD; }
            set { _IRON_ROD = value; }
        }
        private static double _IRON_SCREW = 0;
        public static double IRON_SCREW
        {
            get { return _IRON_SCREW; }
            set { _IRON_SCREW = value; }
        }
        private static double _COPPER_PLATE = 0;
        public static double COPPER_PLATE
        {
            get { return _COPPER_PLATE; }
            set { _COPPER_PLATE = value; }
        }
        private static double _STONE = 0;
        public static double STONE
        {
            get { return _STONE; }
            set { _STONE = value; }
        }
        private static double _STONE_BLOCK = 0;
        public static double STONE_BLOCK
        {
            get { return _STONE_BLOCK; }
            set { _STONE_BLOCK = value; }
        }
        private static double _MAGNET = 0;
        public static double MAGNET
        {
            get { return _MAGNET; }
            set { _MAGNET = value; }
        }
        private static double _COIL = 0;
        public static double COIL
        {
            get { return _COIL; }
            set { _COIL = value; }
        }
    }

NOT: Burada encapsulation kullandım. Bir engelleme koymadım tabi. Bağlantıya giderseniz daha fazla detay görebilirsiniz.

Tabi bu kadar çok olduğuna aldanmayın. Bunları hiçbir yerde yazmıyoruz. Kodlarımızın çalışması için sadece var olmaları gerekiyor.

Buradaki tüm değişkenler aynı isimleri ile veri tabanında yer alıyor. Veritabanımdaki tablo da şu şekilde.

C# String ile Değişkene Erişmek

Gördüğünüz gibi isimler tamamen aynı. Şimdi burada benim amacım, çalışma zamanında yani program çalışıyorken, bu tablodaki verileri alarak, yukarıda verdiğim değişkenlere yazıyor olması gerekiyor. Ve bunu değerleri tek tek değişkenlere atamasını yapmadan yapabiliyor olmam lazım.

Şimdi yukarıda verdiğim kodlar ile bunu yapalım. Tablodan gelen değerler ile değişkeni algılayıp değerini yazan kodumuz bu.

        public static object Set_MyResource_PropValue_FromString(string PropName, double fund)
        {
            object ob = new MyResource();
            var typ = typeof(MyResource);
            var prop = typ.GetProperty(PropName);
            var propVal = prop.SetValue(ob,fund,null);
            return propVal;
        }

Metodumuzun ilk parametresi, ulaşmak ve değerini değiştirmek istediğimiz değişkenin adıdır. İkinci parametre ise yazmak istediğimiz değer.

NOT: typ.GetProperty() yerine kullanabileceğiniz daha fazla seçenek var. Event, Metot vs. Onları siz incelersiniz.

Şimdi diyelim ki veritabanından değerleri çekmiş bir datatable’a almış olalım. Kodlarımız buna yakın olmalıdır.

// dt verileri tutan datatable'dır.
 for (int i = 0; i < dt.Rows.Count; i++)
            {
                string material = dt.Rows[i]["PropName"].ToString();
                double fund = Convert.ToDouble(dt.Rows[i]["Fund"]);
                Set_MyResource_PropValue_FromString(material, fund);
            }

Bu şekilde, değişkeni direk kullanmadan, birkaç satır kod kullanarak bir string ile değişkeni bulup değiştirebiliyoruz.

 

Umarım iyice açıklayabilmişimdir.

Tekrar kısaca belirtmem gerekirkse, bir class içerisindeki bir değişkene, o değişkeni kullanmadan, dışarıdan girilen bir string ile bulabiliyoruz ve değerini değiştirebiliyoruz.

Son olarak bu işlemler son projem olan C# IDLE Oyun Geliştirme – Fabrika Kurma Oyunu (İskelet) içerisinde kullandım. Verdiğim örnekler de o projeden alındı.

 


Bu yazımızda bu kadardı. Diğer derslerde görüşmek üzere…

Derslerime özel olarak hazırladığım Github Projeme buradan ulaşabilirsiniz…  C# Eğitim Seti eğitimi sayfasına gitmek için tıklayınız.

Discord’a katılmayı unutmayın.

Sağlıcakla ve kodla kalın….

Bu yazıya tepkiniz ne oldu?

Yazar Hakkında

Lise Ağ Sistemleri ve Yönetimi bölümü, üniversite Bilgisayar Programcılığı bölümü Ön Lisans, Yönetim Bilişim Sistemleri Lisans öğrenimi aldım. Askerlik görevimi tamamladım. Uzmanlık alanım; C# ve SQL Programlama dilleri ile müşteri odaklı, kullanıcı dostu ERP ve CRM gibi sistemleri geliştirmektir. Ayrıca şuanda PHP ve MYSQL alanında projeler geliştirmekteyim. C++, Phyton, Xamarin, MVC gibi konuları öğrenmek ve kendimi geliştirme çabası içerisindeyim. Discord için: https://discord.gg/FBxZeHu9

Değerli yorumlarınızı bekliyorum. :)