c# - 可以将具有“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
在界面中声明该字段。但这给了我错误,因为实现类将该字段声明为int
or long
,而不是dynamic
。
这些类是从我无法更改的数据库表中自动生成的,所以我不能让这些类全部使用 long 或全部使用 int。
是否有一种优雅的、C-sharp 方式在一个接口中同时表示 int 和 long ?
解决方案
无法在一个接口中同时表示 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 字节)是两种不同的类型。
也许你可以做这样的事情:
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?
推荐阅读
- java - 如何将应用设置为默认应用或让用户选择应用?
- python - 熊猫数据框列到子列
- loops - 更有效地使用游标循环,插入并提交每一行(Oracle)
- c++ - 避免在 C++ 中使用未定义的对象
- go - Should we synchronize variable assignment in goroutine?
- html - 将 HTML 导出到 Word 时的首页背景颜色
- webpack - 使 webpack 在未定义的命名导入上失败
- r - 将 lpSolve 与 linprog 的结果进行比较,是否在实施中存在问题?
- android - Webview 中的全屏视频在 Flutter 中不起作用
- java - 当类在不同的模块中时,ClassLoader.loadClass 方法上的 ClassNotFound 异常