考虑一个函数LengthOfName
;它接受一个具有name
属性的对象,并返回其名称的长度:
class Dog {
public string Name;
}
class Human {
public string Name;
}
class MainClass {
public static int LengthOfNameDog (Dog dog) {
return dog.Name.Length;
}
public static int LengthOfNameHuman (Human human) {
return human.Name.Length;
}
public static void Main (string[] args) {
var Fido = new Dog { Name = "Fido" };
var Alex = new Human { Name = "Alex" };
Console.WriteLine (LengthOfNameDog(Fido));
Console.WriteLine (LengthOfNameHuman(Alex));
}
}
这不是很好,因为我们必须重复一遍。我知道已经有一种解决方法,例如,让Dog
和Human
从单个类继承,例如:
class ThingWithName {
public string Name;
}
class Dog : ThingWithName {}
哪个好。 我遇到的问题是我使用的是从Entity Framework自动生成的类定义,所以我认为我不想弄乱他们的类以说他们继承自一些大师班。
我想做的是实现一个函数,该函数接受具有给定属性的 any 对象的实例,例如,在上面的示例中, Name
属性。
这在c#中可行吗?
答案 0 :(得分:5)
由于Entity Framework生成了部分实体类,所以您可以使用Name
属性定义一个接口,并为实现该接口的每种实体类型创建另一个子类:
public interface IHasName
{
string Name { get; }
}
public partial class MyEntity : IHasName {}
public partial class MyOtherEntity : IHasName {}
public static int LengthOfNameHuman (IHasName entity) {
return entity.Name.Length;
}
如果实体不共享公共基类或接口,则必须使用反射来获取Name
属性。