需要对具有公共字段的 EF 对象执行操作,不确定 if/how 我需要使用接口
Need to perform actions on EF objects with common fields, not sure if/how I need to use Interfaces
我正在使用 Entity Framework。我有几个存储不同统计信息的数据库表:
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'。如何将第一个参数替换为可用于访问传入的任何类型的 Mean 字段的一些通用对象?不确定这是否相关,但我使用 "database first" 并生成这样的模型
编辑:感谢回答,很快就会测试
编辑 - 没有注意到您正在使用数据库优先。我首先在代码中使用这种方法,它可能不适用于您。但我把它留在这里以防以后有人读到这个问题。
您可以定义一个表示公共字段的 interface
,例如:
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;
}
所有 Stats
classes 都可以实现一个接口,比如 IStat
,包含 Mean
属性。将生成的部分 class 扩展为另一个部分 class:
就足够了
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);
我正在使用 Entity Framework。我有几个存储不同统计信息的数据库表:
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'。如何将第一个参数替换为可用于访问传入的任何类型的 Mean 字段的一些通用对象?不确定这是否相关,但我使用 "database first" 并生成这样的模型
编辑:感谢回答,很快就会测试
编辑 - 没有注意到您正在使用数据库优先。我首先在代码中使用这种方法,它可能不适用于您。但我把它留在这里以防以后有人读到这个问题。
您可以定义一个表示公共字段的 interface
,例如:
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;
}
所有 Stats
classes 都可以实现一个接口,比如 IStat
,包含 Mean
属性。将生成的部分 class 扩展为另一个部分 class:
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);