需要在具有公共字段的EF对象上执行操作,不确定我是否需要使用接口



我正在使用实体框架。我有一些数据库表可以存储不同的统计信息:

stats1(stats1id,平均)
Stats2(Stats2ID,平均)
stats3(stats3ID,平均)

我有多种方法,我想将其合并为单个方法。这些方法之间的唯一区别是参数:

public static bool IsValid(Stats1 stat, decimal value) { // }
public static bool IsValid(Stats2 stat, decimal value) { // }
// etc

该方法都使用这些不同统计对象的公共字段 - 'emane'。如何将第一个参数替换为可以使用的某些通用对象,以访问传递哪个类型的平均字段?不确定这是否相关,但我使用"数据库"并生成像这样的模型

编辑:感谢答案,将很快测试

所有Stats类都可以实现包含Mean属性的 IStat。足以扩展另一部分类别的生成部分类别:

partial class Stats1 : IStat { }

ef不介意,只要您不使用导航属性类型的接口(但是您不会首先使用数据库)。

然后,您可以使用通用类型约束(where)定义通用方法:

public static bool IsValid<T>(T stat, decimal value)
    where T : IStat
{
    // Example of what you could do here: 
    return stat.Mean > value);
}

用法:

var valid = IsValid(stat1, 1);

编辑 - 没有注意到您首先使用数据库。我首先在代码中使用这种方法,它可能不适用于您。但是我把它留在这里,以防稍后有人阅读问题。


您可以定义表示公共字段的interface,例如:

public interface IStatEntity
{
    public int Mean { get; set; }
}

并在所有实体上实现接口。实现接口不会干扰EF的映射,也不意味着EF。

我使用相同的方法来具有CreationTimeLastModificationTime之类的属性,然后将它们集中在我的DbContext中。

您可以使用反射来完成您想要的事情。

public static bool IsValid<TStats>(TStats stats, decimal value)
{
    if (Equals(stats, null))
        return false;
    // Get the 'Mean' property
    var propertyInfo = typeof(TStats).GetProperty("Mean");
    if (Equals(propertyInfo, null))
        return false;
    // Get
    var meanValue = propertyInfo.GetValue(stats, null) as decimal?;
    // ... do what ever you want with the meanValue
    return meanValue.HasValue && meanValue.Value == value;
}

最新更新