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

标签 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 自动生成的类定义,所以我不认为我想弄乱他们的类说他们继承自一些大师类。

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

这在 C# 中可行吗?

最佳答案

由于 Entity Framework 生成部分实体类,您可以使用 Name 属性定义一个接口(interface),并为实现此接口(interface)的每个实体类型创建另一个部分类:

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;
}

如果实体不共享公共(public)基类或接口(interface),则必须使用反射来获取 Name 属性。

关于c# - 将函数定义为采用具有给定属性的任何对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57094474/

相关文章:

c# - BeginInvoke 返回什么类型的类?如何使用它来调用 EndInvoke?

c# - 为什么我在插件区域看不到我的窗口?

c# - checkListBox selectedindex和sql映射

c# - NHibernate/Transaction 如何只提交一个对象而不提交整个 session

c# - 将 mask 应用于位图并在运行时生成合成图像

C#4.0 : How to find out if types are co-variantly equal

c# - EF Core DB First,以及如何避免模型生成时的构造函数覆盖

c# - 在 Unity 中使用 getComponent 从附加到游戏对象的脚本中获取图像

c# - 如何获取存储在资源中的图像的 Uri

c# - 如何使用 epplus 修复缓慢的性能?