C# 需要对带有公共字段的EF对象执行操作,不确定是否/如何使用接口

C# 需要对带有公共字段的EF对象执行操作,不确定是否/如何使用接口,c#,entity-framework,interface,C#,Entity Framework,Interface,我正在使用实体框架。我有几个存储不同统计信息的数据库表: Stats1(Stats1ID,平均值) Stats2(Stats2ID,平均值) Stats3(Stats3ID,平均值) 我有多个方法,我想合并成一个方法。这些方法之间的唯一区别是参数: public static bool IsValid(Stats1 stat, decimal value) { // } public static bool IsValid(Stats2 stat, decimal value) { // } /

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

Stats1(Stats1ID,平均值)
Stats2(Stats2ID,平均值)
Stats3(Stats3ID,平均值)

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

public static bool IsValid(Stats1 stat, decimal value) { // }
public static bool IsValid(Stats2 stat, decimal value) { // }
// etc
这些方法都使用这些不同Stat对象的公共字段--“Mean”。如何将第一个参数替换为可以用来访问传入的任何类型的平均字段的一般对象?不确定这是否相关,但我使用“数据库优先”并生成这样的模型


编辑:感谢您的回答,很快将进行测试

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


您可以定义表示公共字段的
接口
,如:

public interface IStatEntity
{
    public int Mean { get; set; }
}
并在所有实体上实现该接口。实现接口不会干扰EF的映射,对EF也没有任何意义


我使用相同的方法来创建属性,例如
CreationTime
LastModificationTime
,然后在我的
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;
}
公共静态bool有效(TStats stats,十进制值)
{
if(等于(stats,null))
返回false;
//获得“平均”属性
var propertyInfo=typeof(TStats).GetProperty(“平均值”);
if(等于(propertyInfo,null))
返回false;
//得到
var meanValue=propertyInfo.GetValue(stats,null)作为十进制数?;
//…用它做任何你想做的事
返回meanValue.HasValue&&meanValue.Value==Value;
}

所有
Stats
类都可以实现一个包含
Mean
属性的接口,比如
IStat
。用另一个分部类扩展生成的分部类就足够了:

partial class Stats1 : IStat { }
EF不介意,只要您不使用导航属性类型的接口(但不首先使用数据库)

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


您是否在这些方法中使用这些实体的任何其他属性?我的意思是,你能不能只传递mean属性而不是StatsX?或者它们不同?我可以,但这更像是一个理论问题,因为它比我所发布的内容更重要,我想把它应用到其他地方。但你是对的。如果我想不出来,我就走那条路
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);