在c#中使用泛型进行有条件比较
本文关键字:有条件 比较 泛型 | 更新日期: 2023-09-27 18:06:06
在我的场景中,我有两种类型的对象。一个plan和一个tier。每一层共享一定的值,而层有3个附加值(Rate, Min和Max)。
我想创建一个泛型方法,根据以下条件有条件地评估是否可以将新对象写入数据库:
创建:
- A层:
((o1.Rate!=o2.Rate) || ((o1.Start!=o2.Start) && (o1.End!=o2.End))) && (MinVal && MaxVal)
- 分级或计划:
(o1.Name!=o2.Name)
- 分级或计划:只能有一个
(Active == true)
,其余必须为假
有可能为这样的东西创建一个泛型方法吗?如果有,有没有类似的例子?或者有人有什么建议吗?
谢谢!
: 我有一个对象列表,我需要将新创建的对象与数据库中的其他对象进行比较然后再将其写入数据库
为了使其工作,泛型方法(或类型)将需要一个约束,使其能够理解您列出的所有单个属性(Rate
, Date
, MinVal
, MaxValue
, Start
和End
)。
如果您担心的所有类型都来自同一个基类或接口,则不需要泛型-只需构建一个接受该基类型的两个参数的方法。
但是,如果它们不这样做,那么同样,泛型可能不适合这里——但是,还有另一种选择。您可以使用dynamic
通过运行时绑定有效地使用这些属性。请注意,如果传递一个没有这些属性的类型的参数,它将在运行时失败
我真的不知道问题是什么…但是如果所有这些都是在数据库中创建之前的某种"预检查",我通常求助于数据库中的存储过程,该过程接受所有相关参数进行创建并返回主键,或者当它失败时返回错误代码……如果成功,然后用主键从数据库加载创建的对象…
数据库通常在这种比较上非常有效-如果我需要并行运行程序的多个实例和/或从不同的程序独立创建对象,数据库解决方案会处理它…
EDIT - as per comment/request:
我通常使用Oracle,所以我没有任何SQL Server存储过程在手…但这些链接应该提供一些见解:
- https://web.archive.org/web/20211020103538/https://www.4guysfromrolla.com/webtech/tips/t100901 - 1. - shtml
- http://www.developerfusion.com/samplechapter/91/stored-procedures/4/
- http://msdn.microsoft.com/en-us/library/ms187926.aspx
- http://msdn.microsoft.com/en-us/library/ms187004.aspx
- http://msdn.microsoft.com/en-us/library/ms190778.aspx
可以这样写:
// I'm making up the types here; modify to match your actual types
public interface IMyObject {
public int Rate { get; set; }
public DateTime Date { get; set; }
public int MinVal { get; set; }
public int MaxVal { get; set; }
public DateTime Start { get; set; }
public DateTime End { get; set; }
}
public static class MyObjectFactory {
public static T Create<T>(int rate, DateTime date, /* etc.. */)
where T : IMyObject, new() {
if (/* tests */) {
throw new MyObjectException("Constraint violated ...");
}
T obj = new T();
obj.Rate = rate;
obj.Date = date;
// etc ....
return obj;
}
}
然后你可以这样使用:
public class SomeMyObject : IMyObject {
// implementation omitted for brevity ...
}
// somewhere:
SomeMyObject obj = MyObjectFactory.Create<SomeMyObject>(rate, date, /* etc. */);
这就是你想要的吗?
你的选择基本上是:
- 使用一个共同的继承基对象与这些道具
- 用这些道具实现一个接口
- 使用反射来获取值并比较它们,如果对象确实不相关,或者如果您只知道在运行时比较的字段值。
Reed在下面提到了动态对象——这可能行得通,我不得不相信他的回答,但是包括了动态需求。