我有不同实体的属性名称,如汽车,人等。根据Id
我想得到名称。但我想在一个方法中完成它,它接受entityName并给出输出取决于那个。
像这样:
public string GetEntityByName(int id,string entityName)
{
using (var context = new MyContext())
{
return context[entityName].Find(id).Name;
}
}
答案 0 :(得分:2)
您的所有实体都应扩展基类或实现定义Name
属性的接口。
public interface INamed {
string Name { get; set; }
}
public class Car : INamed {
public int Id { get; set; }
public string Name { get; set; }
}
我不知道DbContext
是否支持索引属性,但如果确实如此,您可能会设法执行以下操作:
INamed namedEntity = context[entityName].Find(id) as INamed;
if(namedEntity != null)
return namedEntity.Name;
else
return string.Empty;
如果您确定所有实体都是INamed
,那么您可以在一行中实现所有实体:
return ((INamed)context[entityName].Find(id)).Name;
请注意,如果检索到的实体未实施INamed
答案 1 :(得分:2)
如何使用泛型方法来指示实体不是按名称而是按类型?您可以将结果存储为动态变量,以便您可以访问其中的任何属性。
public string GetEntityByName<TEntity>(int id)
{
using (var context = new MyContext())
{
dynamic entity = context.Set<TEntity>.Find(id);
try
{
return entity.Name;
}
catch(Exception e)
{
// Handle the situation when requested entity does not have Name property
}
}
}
或者,您可以使用反射来访问Name属性:
public string GetEntityByName<TEntity>(int id)
{
var nameProperty = typeof(TEntity).GetProperty("Name");
if(nameProperty == null)
return null;
using (var context = new MyContext())
{
object entity = context.Set<TEntity>.Find(id);
return nameProperty.GetValue(entity) as string;
}
}
您可以使用上述方法:
string name = GetEntityByName<Car>(id);
如果您坚持将实体类型作为字符串参数传递,您也可以实现它:
public string GetEntityByName(int id, string entityName)
{
Type entityType = Type.GetType(entityName);
var nameProperty = entityType.GetProperty("Name");
if(nameProperty == null)
return null;
using (var context = new MyContext())
{
object entity = context.Set(entityType).Find(id);
return nameProperty.GetValue(entity) as string;
}
}
仅当GetEntityByName方法在同一个程序集中定义并且与实体类相同的名称空间时,上述方法才有效。否则,作为GetType方法的参数,您必须传递完整的类型名称。