首页 > 解决方案 > 可以将具有“int”和“long”类型的匹配属性名称的两个类联合在一个接口下吗?

问题描述

我有一个项目,其中包含许多不同的自动生成的类,它们共享许多相同的属性。但是它们的“共享”属性之一在某些情况下被声明为 int,而在另一些情况下被声明为 long:

public class Book {
    int Id { get; set; }
}

public class Movie {
    long Id { get; set; }
}

我想将这两个类统一在一个通用接口下:

public interface Media {
    int/long Id;
}

我从这个问题中了解到,我不能将它们视为同一类型,因为它们不是。

基于这个问题,我想我可以dynamic在界面中声明该字段。但这给了我错误,因为实现类将该字段声明为intor long,而不是dynamic

这些类是从我无法更改的数据库表中自动生成的,所以我不能让这些类全部使用 long 或全部使用 int。

是否有一种优雅的、C-sharp 方式在一个接口中同时表示 int 和 long ?

标签: c#

解决方案


无法在一个接口中同时表示 int 和 long

就像想要一辆汽车同时是 Smart 和丰田一样。

我不知道它是否会解决您的问题,但您可以创建一个通用接口:

public interface IMedia<T>
where T : IComparable, IFormattable, IConvertible
{
  T Id { get; set; }
}

用法:

public class Book : IMedia<int>
{
  public int Id { get; set; }
}

public class Movie : IMedia<long>
{
  public long Id { get; set; }
}

因为在 C# 中没有真正的泛型多态性,它可能无法帮助您......即使,int(4 字节)和long(8 字节)是两种不同的类型。

关于 C# 中缺少真正的泛型多态性和缺少菱形运算符

也许你可以做这样的事情:

public abstract class ObjectWithId
{
  private long _Id;
  public int IdAsInt
  {
    get { return checked((int)_Id); }
    set { _Id = (long)value; }
  }
  public long IdAsLong
  {
    get { return _Id; }
    set { _Id = value; }
  }
}

public class Book : ObjectWithId
{
}

public class Movie : ObjectWithId
{
}

如果需要,您可以创建一个接口:

public interface IObjectWithId
{
  public int IdAsInt { get; set; }
  public long IdAsLong { get; set; }
}

但是你说类是自动生成的……那么你可以用接口或抽象父类来修改它们吗?

如果可以,为什么不标准化 ID?


推荐阅读