将函数定义为采用具有给定属性的任何对象

时间:2019-07-18 12:27:53

标签: c#

考虑一个函数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));
  }
}

这不是很好,因为我们必须重复一遍。我知道已经有一种解决方法,例如,让DogHuman从单个类继承,例如:

class ThingWithName {
  public string Name;
}
class Dog : ThingWithName {}

哪个好。 我遇到的问题是我使用的是从Entity Framework自动生成的类定义,所以我认为我不想弄乱他们的类以说他们继承自一些大师班。

我想做的是实现一个函数,该函数接受具有给定属性的 any 对象的实例,例如,在上面的示例中, Name属性。

这在c#中可行吗?

1 个答案:

答案 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属性。