Bir Türü kurtarmak için mümkün (kullanarak " () sınıfa giren") bir numaralama? | Netgez.com
SORU
13 HAZİRAN 2012, ÇARŞAMBA


Bir Türü kurtarmak için mümkün (kullanarak " () sınıfa giren") bir numaralama?

Ben oluşturma bir oyun JAY, C# 4.0, ve ihtiyacım yönetmek için bir sürü Oyun (kod tüm devralınan sınıf "Yeti"), ve işlemek için arka uç yönetimi Oyun ben şu anda bir numaralama, PowerupEffectType, bir değer için her alt sınıf Yeti. Kod sonunda Yeti türü (Sınıf Type genellikle typeof([class name]) ile elde edilen) için PowerupEffectType dönüşümleri yapmak istiyorum.

BaÅŸka bir deyiÅŸle bir grup projesi için, istiyorum evlenmek her deÄŸeri PowerupEffectType için karşılık gelen sınıf Türü olarak mümkün, yani sadece beklemek benim diÄŸer programcılar için kullanmak geçiÅŸ açıklamaları için dönüşüm el ve emin eklemeler/açılımları sonradan dahil olarak birkaç deÄŸiÅŸiklik az yerler olarak mümkün. Ben bir kaç seçenek bu ve en iyi keÅŸfettim ÅŸimdiye kadar oluÅŸturma numaralama sözde yöntemleri yoÄŸunlaÅŸmak her ÅŸey için, tek bir switch deyimi (™ ne istiyorum) sayesinde bazı ipuçları buldum burada: http://msdn.microsoft.com/en-us/library/bb383974.aspx

Ama bunu bir adım daha ileri götürmeye çalışıyorumenum Type kaydedebilirim?Belirli bir türü (link: http://msdn.microsoft.com/en-us/library/cc138362.aspx) gibi numaralamalar kaydedebilirsiniz biliyorum, ama Type onlardan biri değil. Mevcut seçenekler vardırbyte, sbyte, short, ushort, int, uint, long ve ulong. Herhangi bir uygun şekilde kaydetmek için Type yukarıdaki herhangi bir veri türleri ve geri dönüştürme var mı?

Sadece temiz olması için, bunu yapmak isterdim, bir yol arıyordum nedir:

// (Assuming 'LightningPowerup', 'FirePowerup', and 'WaterPowerup' are
// all declared classes that inherit from a single base class)

public enum PowerupEffectType
{
    LIGHTNING = typeof(LightningPowerup),
    FIRE = typeof(FirePowerup),
    WATER = typeof(WaterPowerup)
}

Yapmak için herhangi bir yolu var mı, yoksa zaten ™'u tam bir sorun için bir çözüm overcomplicating mıyım?

Şimdiden teşekkürler!

CEVAP
13 HAZİRAN 2012, ÇARŞAMBA


Bu gibi yapamazsındeğerbir numaralama, ama bunu belirtebilirsinizöznitelik:

using System;
using System.Runtime.CompilerServices;

[AttributeUsage(AttributeTargets.Field)]
public class EffectTypeAttribute : Attribute
{
    public Type Type { get; private set; }

    public EffectTypeAttribute(Type type)
    {
        this.Type = type;
    }
}

public class LightningPowerup {}
public class FirePowerup {}
public class WaterPowerup {}

public enum PowerupEffectType
{
    [EffectType(typeof(LightningPowerup))]
    Lightning,
    [EffectType(typeof(FirePowerup))]
    Fire,
    [EffectType(typeof(WaterPowerup))]
    Water
}

Daha sonra bu öznitelik yansıması ile yürütme zaman değerleri elde edebilirsiniz. Ancak, yapardımşahsensadece bir sözlük oluşturmak:

private static Dictionary<PowerupEffectType, Type> EffectTypeMapping =
    new Dictionary<PowerupEffectType, Type>
{
    { PowerupEffectType.Lightning, typeof(LightningPowerup) },
    { PowerupEffectType.Fire, typeof(FirePowerup) },
    { PowerupEffectType.Water, typeof(WaterPowerup) }
};

Özel bir öznitelik, keman yansıma kod ile değerleri ayıklamak için gerek için gerek yok.

Bunu PaylaÅŸ:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VÄ°DEO

Rastgele Yazarlar

  • Kanaal van Dj0fifty

    Kanaal van D

    28 EKÄ°M 2011
  • Nick Pitera

    Nick Pitera

    8 NÄ°SAN 2006
  • Propaganda Time

    Propaganda T

    19 EYLÃœL 2010