需要有关泛型、接口和基类的帮助
本文关键字:基类 帮助 接口 泛型 | 更新日期: 2023-09-27 18:32:10
假设我有两个对象:
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; }
}
如何将其转换为通用?
我最好需要一些东西,以便服务实现一个接口,如果可能的话,只调用一些泛型基类。
如果两个对象共享一个共同的父类会有帮助吗?如果是这样,它们将如何构建?
补遗:
回报才是我真正的问题。
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.
我不确定我在这一点上是否有意义,或者我所要求的是否甚至可以使用泛型。
我相信
您不会在这里从泛型中获得好处。原因是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; }
}
这是一个解决方案,它应该可以完成您所追求的事情:
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>
{
}
Justin 是正确的,如果不修改 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;
}
}