2

私は次の問題を抱えています(簡略化)。

私は犬のリストを持っています:

public List<Dog> dogs { get; set; }

私は現在、ビューで変換することにより、jsonオブジェクトとしてこのリストにアクセスしています。

@(new HtmlString(@Json.Encode(@ViewBag.dogs)))

次に、javascriptを使用してこのjsonオブジェクトを反復処理し、ページに表示します。

このリストに車を追加したいと思います。

ただし、リストは、リストを1つとして作成し、共通点を持たdogsせることを最初に考えたリストとして強く入力されているため、両方ともオブジェクトですdogscars

犬のリストをのリストに変更しようとするとobjects、次のエラーが発生しました

Cannot implicitly convert type 'System.Collections.Generic.List<object>' to System.Collections.Generic.List<dog>

私はそれを調べて、犬と車のリストを持てないだろうと私に言う以外はあまり役に立たなかったこの質問を見つけました。しかし、私の目的では、これは適切ではありません。アプリケーションで両方にアクセスできるように、リストに犬と車の両方を含める必要があります。

私が提案されると予想する1つの解決策は、2つの別々のリストがあり、2つの別々のajaxリクエストを作成することです。ただし、ソリューションが理想的ではないように、車と犬を特定の順序で(基本的に作成された時間に基づいて)混合する必要があります。

要するに、私はこれを達成するための最良の方法は何であるか疑問に思っています。おそらく私は完全に間違った方向に進んだので、それが理にかなっているなら、私は完全に異なることをすることに反対していません。

いつものように助けてくれてありがとう!

編集:私はキャストを試しましたが、それはうまくいきます。ただし、犬のプロパティにアクセスする必要があり(「毛皮」と呼びましょう)、アクセスできないようです(もう一度キャストする必要がありますか?)

'object' does not contain a definition for 'fur'
4

5 に答える 5

7

犬と車の両方を含むリストを作成できるのは、それらが同じインターフェイスを実装するか、同じクラスを拡張する場合のみです(たとえば、オブジェクトの場合、typeof in conditionを使用して、それらに対していくつかのアクションを実行できます)。

編集:

簡単な例

using System;
using System.Collections.Generic;

namespace Polymorphism
{
    class Program
    {
        public class Car
        {
            public string Drive()
            {
                return "Wrrrr!";
            }
        }

        public class Dog 
        {
            public string Talk()
            {
                return "Woof";
            }
        }

        static void Main()
        {
            var car = new Car();
            var dog = new Dog();

            List<object> list = new List<object>();
            list.Add(car);
            list.Add(dog);

            foreach (object o in list)
            {
                if (o is Car)
                    Console.WriteLine((o as Car).Drive());
                else
                    Console.WriteLine((o as Dog).Talk());
            }
        }
    }
}

そのコードは申し訳ありませんが、ウィキペディアからコピーし、 Ideoneを使用して編集しました

于 2012-07-26T19:09:39.743 に答える
3

車がどこに来るのか、そしてなぜあなたが最初にあなたの財産を単に変更することができないのかは私には本当に明確ではありませんが、List<object>あなたはすることができます:

List<object> objects = foo.Dogs.Cast<object>().ToList();

または、C#4では、ジェネリック共分散を使用して、次のように記述できます。

List<object> objects = foo.Dogs.ToList<object>();
于 2012-07-26T19:06:23.003 に答える
2

2つのオブジェクトに共通するものを理解し、基本クラスまたはインターフェイスのいずれかを使用してみてください。インターフェイスを使用した場合は、次のようになります。

public interface IAnimal{
   Fur Fur{ get; set; }
   bool CanBark { get; set;}
}

public class Dog : IAnimal {
   public Fur Fur{ get; set; }
   public bool CanBark { get; set;}
}

public class Cat: IAnimal {
   public Fur Fur{ get; set; }
   public bool CanBark { get; set;}
}

public class Fur{
    public string Color {get;set;}
    public int Length {get;set}
}

などなど

次に、リストは次のようになります。

public List<IAnimal> dogs { get; set; }
public List<IAnimal> cats{ get; set; }

(ペット)思考の糧

于 2012-07-26T19:18:27.787 に答える
2

リストにさまざまなオブジェクトを含め、それらに共通するプロパティにアクセスする最も簡単な方法は、クラスでインターフェイスを使用することです。

例えば:

public interface ICoated {
    string Coating { get; set; }
}

public class Dog : ICoated {
    public string Coating {
        get { return Fur; }
        set { Fur = value; }
    }
}

public class Car: ICoated {
    public string Coating {
        get { return PaintJob; }
        set { PaintJob = value; }
    }
}

次に、を使用してList<ICoated>、すべて何かでコーティングされているオブジェクトにアクセスします。明らかに、多くの共通の属性がある場合は、このモデルを適切に拡張します。

于 2012-07-26T19:18:10.367 に答える
1

おそらく、共有プロパティと「Type」プロパティを持つインターフェイスを作成します。

public enum CrazyObjectType
{
    Dog,
    Car
}

public interface ICrazyObject
{
    DateTime Date { get; }
    CrazyOjbectType MyObjectType { get; }
}

public class Dog : ICrazyObject
{
    public Dog()
    {
        MyObjectType = CrazyObjectType.Dog;
    }

    public DateTime Date { get; }
    public CrazyObjectType MyObjectType { get; }
}

public class Car : ICrazyObject
{
    public Car()
    {
        MyObjectType = CrazyObjectType.Car;
    }

    public DateTime Date { get; }
    public CrazyObjectType MyObjectType { get; }
}

次に、代わりに、車や犬にキャス​​トする前にタイプをチェックするList<object>ことができます。List<ICrazyObject>

foreach (var myObject in myObjects)
{
    if (myObject.MyObjectType == CrazyObjectType.Car)
    {
        var myCar = (Car)myObject;
        //Do Stuff with myCar here.
    }
}

これにより、キャストする前にタイプを安全に知ることができます。次に、犬とは異なるタイプの車にあるプロパティは何でも。簡単かつ安全にアクセスできます!

于 2012-07-26T19:25:03.837 に答える