我不太熟悉反射,但是,如果该类具有与某个属性关联的属性,是否可以实现一个返回object
的方法?
我认为这可能会使以下实施不需要
public interface IEntity
{
object ID { get; }
}
public class Person : IEntity
{
[Key]
public int PersonID { get; }
public string Name { get; set; }
public int Age { get; set; }
object IEntity.ID
{
get { return PersonID; }
}
}
因此,不是为每个类实现'IEntity',你可以这样做:
public abstract class EntityBase
{
public object ID { get { return FindPrimaryKey(); } }
protected object FindPrimaryKey()
{
object key = null;
try
{
//Reflection magic
}
catch (Exception) { }
return key;
}
}
这样可以节省一些时间,而不必通过所有代码优先生成的类并实现这个小功能。
答案 0 :(得分:2)
是的,绝对可以做到。请考虑以下代码:
protected object FindPrimaryKey()
{
object key = null;
var prop = this.GetType()
.GetProperties()
.Where(p => Attribute.IsDefined(p, typeof(Key)))
if (prop != null) { key = prop.GetValue(this); }
return key;
}
但是,我建议缓存该值。为键值添加私有字段:
object _keyValue;
然后设置:
protected void FindPrimaryKey()
{
var prop = this.GetType()
.GetProperties()
.Where(p => Attribute.IsDefined(p, typeof(Key)))
if (prop != null) { _keyValue = prop.GetValue(this); }
}
然后返回:
public object ID { get { return _keyValue; } }