1

次の 2 つのオブジェクトがあるとします。

public class Object1
{
  string prop1;
  string prop2;
}

public class Object2
{
  string prop1;
  int prop2;
  int prop3;
}

および次のクラスとメソッド:

public class Object1Service
{
  public Object1 GetObject(Object1 o) { return o; }
  public void SaveProperty2(Object1 o, string s) { o.prop2 = s; }
}

public class Object2Service
{
  public Object2 GetObject(Object2 o) { return o; }
  public void SaveProperty2(Object2 o, int i) { o.prop2 = i; }
}

これをジェネリックにするにはどうすればよいですか?
サービスがインターフェイスを実装し、可能であればジェネリック基本クラスを呼び出すように、何かが必要になることが望ましいです。
2 つのオブジェクトが共通の親クラスを共有していると役に立ちますか? もしそうなら、それらはどのように構成されますか?


補遺:

私の本当の問題は返品です。

public T GetObjectByKey<T>(string key)
{
    using (DBEntities db = new DBEntities())
    {
        try
        {
            T returnedEntity = default(T);

            switch (EntityDictionary[typeof (T)])
            // I have a dictionary setup like this dictionary<type, string>
            {
                case "Object1" :
                    returnedEntity = ( from r in db.ObjectONESets
                                        where r.prop1 == key
                                        select new T
                                        {
                                            prop1 = r.prop1,
                                            prop2 = r.prop2
                                        }).FirstOrDefault();
                    break ;
                case "Object2" :
                    returnedEntity = ( from r in db.ObjectTWOSets
                                        where r.prop1 == key
                                        select new T
                                        {
                                            prop1 = r.prop1,
                                            prop2 = r.prop2,
                                            prop3 = r.prop3
                                        }).FirstOrDefault();
                    break ;
            }
            return returnedEntity;
        }
        catch (NullReferenceException )
        {
            return default(T);
        }
    }
}

すべてのオブジェクト プロパティをベース オブジェクトに配置しないと、prop1-3 が T のプロパティであることを知る方法がありません。
すべてのプロパティ (共通であるかどうかにかかわらず) をベース オブジェクトに配置した場合、Object1 が必要な場合は、次に、必要のない prop3 が添付されています。
この時点で十分な意味があるかどうか、または私が求めていることがジェネリックでも実行可能かどうかはわかりません。

4

3 に答える 3

5

ここでジェネリックを使用してもメリットは得られないと思います。その理由はprop2、これらのクラスごとに が異なるタイプだからです。それらが同じである場合、共通のプロパティを基本クラスに入れて、このようなことを行うことができます

public class BaseObject
{
    string prop1;
    string prop2
}

public class Object1 : BaseObject
{

}

public class Object2 : BaseObject
{
    int prop3;
}

public class ObjectService<T> where T is BaseObject
{
    public T GetObject(T o) { return o; }
    public void SaveProperty2(T o, string i) { o.prop2 = i; }
}

少なくとも、現在の例を使用して GetObject をジェネリックにすることができます...ただし、そのメソッド全体は本当に無意味に思えます:

public class ObjectService
{
  public T GetObject<T>(T o) { return o; }
  public void SaveObject2Property2(Object2 o, int i) { o.prop2 = i; }
  public void SaveObject1Property2(Object1 o, string s) { o.prop2 = s; }
}
于 2012-04-24T16:25:38.107 に答える
3

これがあなたが求めていることをするべき解決策です:

public interface IPropertyProvider<T>
{
    T Prop2 { get; set; }
}

public class ObjectService<T, TProp> where T : IPropertyProvider<TProp>
{
    public void SaveProperty(T o, TProp i)
    {
        o.Prop2 = i;
    }
}

public class Object1 : IPropertyProvider<string>
{
    public string Prop1 { get; set; }
    public string Prop2 { get; set; }
}

public class Object2 : IPropertyProvider<int>
{
    public string Prop1 { get; set; }
    public int Prop2 { get; set; }
    public int Prop3 { get; set; }
}

public class Object1Service : ObjectService<Object1, string>
{
}

public class Object2Service : ObjectService<Object2, int>
{
}
于 2012-04-24T16:33:17.383 に答える
1

OPのオブジェクトを変更せずにジャスティンは正しいです。これを「きれいに」汎用にする方法はありません。

ここに厄介な解決策があります:

interface IObject<T>
{
    T prop2 {get;set;}
}

class ObjectService<T, Z> where T : IObject<Z>
{
    public T GetObject(T o)
    {
        return o;
    }

    public void SetValue(T o, Z val)
    {
        o.prop2 = val;
    }
}
于 2012-04-24T16:22:36.120 に答える