C# Implicit Casting

  1. KısayolKısayol reportŞikayet pmÖzel Mesaj
    unbalanced
    unbalanced's avatar
    Kayıt Tarihi: 14/Haziran/2006
    Erkek

    Arkadaşlar bu saatte kimse çıkacağını sanmıyorum ama kafam durdu yapamadım bi şeyi :)

    şimdi bir üyelik modülü yazdım asp.net mvc de. iki farklı form var ama tek bir action kullanmak istiyorum. iki formun modeli de farklı

    sınıflarda ve ikisi de ortak bir interfaceden türettim.. şimdi action şu

     

    [HttpPost]
    
    [AllowAnonymous]
    
    public ActionResult Register(object tmpModel)
    
    {
    
      Type t = tmpModal.GetType();
    
      var model = t==typeof(Member)?(Member)tmpModel:(Corporation) tmpModel;
    
    ....
    
    }

     

    bu tarz bi mantık kurdum.. şimdi tmpmodel Member sınıfının tipindeyse model değişkenim member türünden olmalı. değil ise Corporation

    türünden olmalı. ancak bu şekilde cast ettiğimde hata veriyor. (impicit castin olmaz diye)

    register daki parametreyi dynamic yaptım yemedi.. generic class kullanayım dedim yapamdım..

    register metodunun devamında model değişkeninin bir iki propertysine erişiyorum bunlar da zaten ortak olanlar (interfaceden

    türüyenlerden bi iki tanesi) sonra zaten farklı metodlar çağırıp yollarım problem değil o.. işime lazım olan tek şey model değişkenini sınıf

    tipine göre member ya da corporation yapmak.. farklı bi metod yazmadan yapmak istiyorum, şuan aklıma bi yol gelmedi.. bu sorunu nasıl

    çözerim


    Ülkesini Seven Her Türk Vatandasi, Ülkesinin Sessiz Istilasi'na karsi durmak zorunda.
  2. KısayolKısayol reportŞikayet pmÖzel Mesaj
    unbalanced
    unbalanced's avatar
    Kayıt Tarihi: 14/Haziran/2006
    Erkek

    çıkamadım işin içinden şimdi :) bu saatte de yardımcı olacak çıkmaz sanırım.. artık sabah bakarım 

    edit: kod tekrarı yapmak istemiyorum.. yani şöyle bi şey yazsak işime gelmez

     

    if(t==typeof(Member))

    {

    kodlar...

     

    }

    else

    {

    kodlar... 

    }

     

    aradığım şey bir nesneyi generic olarak iki sınıf şeklinde de kullanabilmek tarzı bir şey

    unbalanced tarafından 16/Şub/13 05:02 tarihinde düzenlenmiştir

    Ülkesini Seven Her Türk Vatandasi, Ülkesinin Sessiz Istilasi'na karsi durmak zorunda.
  3. KısayolKısayol reportŞikayet pmÖzel Mesaj
    attackatak
    attackatak's avatar
    Kayıt Tarihi: 06/Mayıs/2007
    Erkek

    1.yol: Member ve Corporation şeklinde iki ayrı class aç. Şuan ki mevcut class ından mirasa bırak. O son postunda ki if-else yapısından da yönlendirme işlerini yaparsın. Böylece if-else içinde kod birikmemiş olur.

    2.yol: Eğer bu işine gelmezse, overload bi method tanımla. O kendi if-else ini yapar zaten ;)

     

    public ActionResult Register(object tmpModel)

    {
          abc(tmpModal.GetType());
    }

     

    private void abc(Member _mbr)

    {
    ....
    }

    private void abc(Corporation _crp)

    {
    ....
    }

  4. KısayolKısayol reportŞikayet pmÖzel Mesaj
    attackatak
    attackatak's avatar
    Kayıt Tarihi: 06/Mayıs/2007
    Erkek

    Yani eğer dediklerini doğru anladıysam, extra bir method ya da if-else i mecbur kullanacaksın... Sonuçta elma ile armut birbirine eşit değil. İkisinin de kendine özgü karakteristlik özellikleri var.

    Ha ama işi o method a getirmeden önce, abstract class lar kullanarak oraya tek method halinde getirebilirsin. Önceden yazdığım örnek bir kod:

    abstract class duck
        {
            public virtual string swim()
            {
                return "Ortak yüzüyorum";
            }

            public virtual string quvack()
            {
                return "Ortak konuşuyorum";
            }

            public virtual string fly()
            {
                return "Ortak uçuyorum";
            }

            public abstract string display();
        }

        class mallard : duck
        {
            public override string display()
            {
                return "ben kahverengiyim";
            }
        }

        class redDuck : duck
        {
            public override string display()
            {
                return "ben beyazım";
            }
        }

        class rubber : duck
        {
            public override string quvack()
            {
                return "gıcırtı";
            }

            public override string fly()
            {
                return "benim kanatlarım yok";
            }

            public override string display()
            {
                return "ben sarıyım";
            }
        }

  5. KısayolKısayol reportŞikayet pmÖzel Mesaj
    attackatak
    attackatak's avatar
    Kayıt Tarihi: 06/Mayıs/2007
    Erkek

    Yapın da illa ki interface gerekiyorsa:


        abstract class Duck
        {
            public IQuack quackIntance;
            public IFly flyInstance;

            public virtual string swim()
            {
                return "Ortak yüzüyorum";
            }

            public virtual string performQuack()
            {
                return quackIntance.quack();
            }

            public virtual string performFlying()
            {
                return flyInstance.fly().ToString();
            }

            public abstract string display();
        }

        class MallardDuck : Duck
        {
            public MallardDuck()
            {
                this.quackIntance = new QuackNormal();
                this.flyInstance = new Flying();
            }
            public override string display()
            {
                return "mallard";
            }
        }

        class RedHeadDuck : Duck
        {
            public RedHeadDuck()
            {
                this.quackIntance = new QuackNormal();
                this.flyInstance = new Flying();
            }

            public override string display()
            {
                return "redHead";
            }
        }

        class RubberDuck : Duck
        {
            public RubberDuck()
            {
                this.quackIntance = new QuackGicirti();
                this.flyInstance = new NotFly();
            }

            public override string display()
            {
                return "Rubber";
            }
        }

        class DejoyDuck : Duck
        {
            public DejoyDuck()
            {
                this.quackIntance = new QuackMute();
                this.flyInstance = new NotFly();
            }

            public override string display()
            {
                return "tahta";
            }
        }

        #region interfaceQuackVeClassList
        interface IQuack
        {
            string quack();
        }
        class QuackNormal : IQuack
        {
            public string quack()
            {
                return "quackNormal";
            }
        }
        class QuackGicirti : IQuack
        {
            public string quack()
            {
                return "quackGicirti";
            }
        }
        class QuackMute : IQuack
        {
            public string quack()
            {
                return "quackMute";
            }
        }
        #endregion

        #region interfaceFlyVeClassList
        interface IFly
        {
            bool fly();
        }
        class Flying : IFly
        {
            public bool fly()
            {
                return true;
            }
        }
        class NotFly : IFly
        {
            public bool fly()
            {
                return false;
            }
        }
        #endregion

     

    Bunların hepsinde geri dönüş "Duck" class ı üzerinden oluyor. Umarım işini görür.

  6. KısayolKısayol reportŞikayet pmÖzel Mesaj
    unbalanced
    unbalanced's avatar
    Kayıt Tarihi: 14/Haziran/2006
    Erkek

    sağolasın hocam çok yazmışsın eline sağlık ama benim istediğimle alakalı şeyler değil bunlar. yazdıklarını biliyorum zaten. şimdi şöyle örnek vereyim

    public intercface ICommonRegistration
    
    {
    
    string ortak1 { get; set; }
    
    string ortak2 { get; set; }
    
    } 
    
    public class Member: ICommonRegistration
    
    {
    
    public string ortak1 { get; set; }
    
    public string ortak2 { get; set; }
    
    public string a { get; set; }
    
    public string b { get; set; }
    
    } 
    
    public class Corporation : ICommonRegistration
    
    {
    
    public string ortak1 { get; set; }
    
    public string ortak2 { get; set; }
    
    public string c { get; set; }
    
    public string d { get; set; }
    
    }

     

    yapılar bu şekilde olsun diyelim.

    registration metodunda ise 

     

    [HttpPost]  
    
    [AllowAnonymous] 
    
     public ActionResult Register(object tmpModel)  
    
    {  
    
      Type t = tmpModal.GetType(); 
    
       var model = t==typeof(Member)?(Member)tmpModel:(Corporation) tmpModel; 
    
     
    
        model.ortak1 ="bu alan ikisindede ortak";
    
       model.ortak2= "bu alanda ikisinde ortak";
    
    //farklı olanlara burada değer vermiyorum
    
     MembershipCreateStatus createStatus;

    bool result = BenimMembership.Register(model, out createStatus); if (!result) { ......... } ......... }

     

     

    BenimMemberShip.Register metodu da object türünden değer alıyor. ben orada farklı metodlar kullanarak ayırt ediyorum problem değil orası. 

    şimdi; kullanıcı formu doldurduğunda Register(object tmpModel) buradaki tmpModel o formdaki verileri barındırıyor. ben de bu verileri kullanmak

    istiyorum. Member türünden yaparsam Corporation da bulunan propertyler null oluyor, tersindede Memberdakiler null oluyor. O yüzden object

    olarak aldım. sonra türüne göre model değişkenine eşitlemek istiyorum. yazdığım kodlar yukarıdaki gibi kısa değil, buradan bakınca basit bi ifle

    kod ayrımı yapılır sanılıyor ama ben kod tekrarı yapmak istemiyorum. Register metodunda her şey aynı iki class içinde bir fark gözüktürecek kod

    mevcut değil. sadece ortak alanlarına değer verip metodu çağırmak istiyorum.  

     

    edit: en iyisi iki farklı action kullanmak :) boşuna kasıyorum gereksiz gereksiz

     

    unbalanced tarafından 16/Şub/13 13:29 tarihinde düzenlenmiştir

    Ülkesini Seven Her Türk Vatandasi, Ülkesinin Sessiz Istilasi'na karsi durmak zorunda.
Toplam Hit: 748 Toplam Mesaj: 6