SORU
18 Kasım 2008, Salı


Bu daha iyi bir alternatif 'tür geçiş var'?

C olarak görme * olmuyorgeçinbir Tür-bir ilişkiler daha farklı . çünkü özel bir durum olarak eklendi değildi anladığım kadarıyla ( ^strong>durumdauygulanabilir), orada daha iyi bir yol için bu tür geçiş simülasyonu?

void Foo(object o)
{
    if (o is A)
    {
        ((A)o).Hop();
    }
    else if (o is B)
    {
        ((B)o).Skip();
    }
    else
    {
        throw new ArgumentException("Unexpected type: "   o.GetType());
    }
}

CEVAP
18 Kasım 2008, Salı


Tür geçiş kesinlikle C eksik#. //İf else / / eğer başka geniş bir açıklama olmadan bunu yapmak için, farklı bir yapı ile çalışmak gerekir. Bir blog yazısı bir süre geri TypeSwitch bir yapı inşa etmek için ne kadar ayrıntılı yazdım.

http://blogs.msdn.com/jaredpar/archive/2008/05/16/switching-on-types.aspx

Kısa versiyon: TypeSwitch gereksiz döküm önlemek ve dava özeti normal bir anahtara benzer bir sözdizimi vermek için tasarlanmıştır. Örneğin, burada standart Windows form bir olay üzerine eylem TypeSwitch

TypeSwitch.Do(
    sender,
    TypeSwitch.Case<Button>(() => textBox1.Text = "Hit a Button"),
    TypeSwitch.Case<CheckBox>(x => textBox1.Text = "Checkbox is "   x.Checked),
    TypeSwitch.Default(() => textBox1.Text = "Not sure what is hovered over"));

TypeSwitch için kod aslında oldukça küçük ve kolayca proje içine koymak olabilir.

static class TypeSwitch {
    public class CaseInfo {
        public bool IsDefault { get; set; }
        public Type Target { get; set; }
        public Action<object> Action { get; set; }
    }

    public static void Do(object source, params CaseInfo[] cases) {
        var type = source.GetType();
        foreach (var entry in cases) {
            if (entry.IsDefault || entry.Target.IsAssignableFrom(type)) {
                entry.Action(source);
                break;
            }
        }
    }

    public static CaseInfo Case<T>(Action action) {
        return new CaseInfo() {
            Action = x => action(),
            Target = typeof(T)
        };
    }

    public static CaseInfo Case<T>(Action<T> action) {
        return new CaseInfo() {
            Action = (x) => action((T)x),
            Target = typeof(T)
        };
    }

    public static CaseInfo Default(Action action) {
        return new CaseInfo() {
            Action = x => action(),
            IsDefault = true
        };
    }
}

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • BetterCoder

    BetterCoder

    17 Aralık 2012
  • Jay Will

    Jay Will

    19 NİSAN 2006
  • Michael Zhang

    Michael Zhan

    8 EYLÜL 2012