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
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.
&Quot;T genel Bir dizi varargs bir par...
Tanımlamak için nasıl "türü bir ç...
Önde gelen çift eğik çizgi üzere bir U...
IDisposable ve "kullanarak" ...
Geri" svn;?bir kaza sonucu " k...