Pertanyaan C # aktifkan jenis [duplikat]


Kemungkinan Duplikat:
C # - Apakah ada alternatif yang lebih baik daripada ini untuk 'mengaktifkan tipe'? 

C # tidak mendukung pengaktifan jenis objek. Apa pola terbaik dari simulasi ini:

switch (typeof(MyObj))
    case Type1:
    case Type2:
    case Type3:

Terima kasih!


124
2017-12-18 14:32


asal


Jawaban:


Saya biasanya menggunakan kamus tipe dan delegasi.

var @switch = new Dictionary<Type, Action> {
    { typeof(Type1), () => ... },
    { typeof(Type2), () => ... },
    { typeof(Type3), () => ... },
};

@switch[typeof(MyType)]();

Ini sedikit kurang fleksibel karena Anda tidak dapat jatuh kasus, terus dll. Tapi saya jarang melakukannya juga.


150
2017-12-18 14:51



Ada jawaban sederhana untuk pertanyaan ini di Ganti huruf pada tipe c # yang menggunakan kamus tipe untuk mencari fungsi lambda.

Di sini adalah bagaimana itu bisa digunakan

    var ts = new TypeSwitch()
        .Case((int x) => Console.WriteLine("int"))
        .Case((bool x) => Console.WriteLine("bool"))
        .Case((string x) => Console.WriteLine("string"));

    ts.Switch(42);     
    ts.Switch(false);  
    ts.Switch("hello"); 
}

Ada juga solusi umum untuk masalah ini dalam hal pencocokan pola (baik jenis dan kondisi periksa waktu berjalan) di beralih / ide pencocokan pola

  var getRentPrice = new PatternMatcher<int>()
        .Case<MotorCycle>(bike => 100 + bike.Cylinders * 10) 
        .Case<Bicycle>(30) 
        .Case<Car>(car => car.EngineType == EngineType.Diesel, car => 220 + car.Doors * 20)
        .Case<Car>(car => car.EngineType == EngineType.Gasoline, car => 200 + car.Doors * 20)
        .Default(0);

    var vehicles = new object[] {
        new Car { EngineType = EngineType.Diesel, Doors = 2 },
        new Car { EngineType = EngineType.Diesel, Doors = 4 },
        new Car { EngineType = EngineType.Gasoline, Doors = 3 },
        new Car { EngineType = EngineType.Gasoline, Doors = 5 },
        new Bicycle(),
        new MotorCycle { Cylinders = 2 },
        new MotorCycle { Cylinders = 3 },
    };

    foreach (var v in vehicles)
    {
        Console.WriteLine("Vehicle of type {0} costs {1} to rent", v.GetType(), getRentPrice.Match(v));
    }

24
2017-09-04 20:29



Ini adalah lubang di permainan C #, belum ada peluru perak.

Anda harus google pada 'pola pengunjung' tetapi mungkin sedikit berat untuk Anda tetapi masih sesuatu yang harus Anda ketahui.

Berikut ini lagi tentang masalah ini menggunakan Linq: http://community.bartdesmet.net/blogs/bart/archive/2008/03/30/a-functional-c-type-switch.aspx

Kalau tidak, sesuatu di sepanjang garis ini bisa membantu

// nasty..
switch(MyObj.GetType.ToString()){
  case "Type1": etc
}

// clumsy...
if myObj  is Type1 then
if myObj is Type2 then

dll.


9
2017-12-18 14:39



Saya melakukannya sekali dengan solusi, semoga itu membantu.

string fullName = typeof(MyObj).FullName;

switch (fullName)
{
    case "fullName1":
    case "fullName2":
    case "fullName3":
}

3
2017-12-18 14:42



Saya telah menggunakan bentuk ini switch-case pada kesempatan langka. Bahkan kemudian saya telah menemukan cara lain untuk melakukan apa yang saya inginkan. Jika Anda menemukan bahwa ini adalah satu-satunya cara untuk mencapai apa yang Anda butuhkan, saya akan merekomendasikan solusi @ Mark H.

Jika ini dimaksudkan untuk menjadi semacam proses pengambilan keputusan pabrik, ada cara yang lebih baik untuk melakukannya. Kalau tidak, saya benar-benar tidak dapat melihat mengapa Anda ingin menggunakan tombol pada jenis.

Berikut adalah sedikit contoh yang memperluas solusi Markus. Saya pikir ini adalah cara yang bagus untuk bekerja dengan tipe:

Dictionary<Type, Action> typeTests;

public ClassCtor()
{
    typeTests = new Dictionary<Type, Action> ();

    typeTests[typeof(int)] = () => DoIntegerStuff();
    typeTests[typeof(string)] = () => DoStringStuff();
    typeTests[typeof(bool)] = () => DoBooleanStuff();
}

private void DoBooleanStuff()
{
   //do stuff
}

private void DoStringStuff()
{
    //do stuff
}

private void DoIntegerStuff()
{
    //do stuff
}

public Action CheckTypeAction(Type TypeToTest)
{
    if (typeTests.Keys.Contains(TypeToTest))
        return typeTests[TypeToTest];

    return null; // or some other Action delegate
}

3
2017-12-18 15:03