C# Implicit Casting
-
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
-
çı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 -
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)
{
....
} -
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";
}
} -
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;
}
}
#endregionBunların hepsinde geri dönüş "Duck" class ı üzerinden oluyor. Umarım işini görür.
-
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
