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

  • Chuck Testa

    Chuck Testa

    14 AĞUSTOS 2011
  • FRED

    FRED

    1 EKİM 2005
  • wolfys you tube

    wolfys you t

    22 Kasım 2006