0

Objectだけが変更を行う場合、同じ種類のプロシージャを使用する関数はほとんどありません。そのメソッドのグループにジェネリック関数を書き込もうとしましたが、TのIDを取得できませんでした。

これをリファクタリングするのを手伝ってもらえますか?

List<ObjectOfSomeKind> allObjects = new List<ObjectOfSomeKind>() { new ObjectOfSomeKind{ ID = 1}, new ObjectOfSomeKind { ID = 2 }};
List<ObjectOfSomeKind> objects = new List<ObjectOfSomeKind>();
            for (int i = 0; i < ids.Count(); i++)
            {
                int id = ids.ElementAt(i);
                ObjectOfSomeKind object = allObjects .Where(item => item.ID.Equals(id)).SingleOrDefault();
                if (object == null)
                {
                    throw new Exception("error");
                }

                objects.Add(object);
            }
4

1 に答える 1

1

ID プロパティを使用してインターフェイス (または基本クラス) を定義する

public interface IEntity
{
   int ID { get; set; }
}

クラスによってこのインターフェースを実装します

public class Foo : IEntity
{
   public int ID { get; set; }
}

次にIEntity、コードで使用するか、(ジェネリックを使用する場合) ジェネリック クラスまたはメソッドに制約を追加します。

where T : IEntity

UPDATE すべてのクラスに ID プロパティがdynamicある場合は、オブジェクトを使用することもできます (解決策になることもありますが、コンパイル時のチェックを好みます)。

List<dynamic> allObjects = new List<dynamic>() { 
    new ObjectOfSomeKind{ ID = 1}, new ObjectOfSomeKind { ID = 2 }};
List<dynamic> objects = new List<dynamic>();

for (int i = 0; i < ids.Count(); i++)
{
    int id = ids.ElementAt(i);
    dynamic obj = allObjects.Where(item => item.ID.Equals(id)).SingleOrDefault();
    if (obj == null)                
        throw new Exception("error");                

    objects.Add(obj);
}
于 2013-02-12T08:41:58.180 に答える