我有一些具有公共(public)属性的类,但是,我不能使它们派生自基类型(LINQ-to-SQL 限制)。
我想将它们视为具有基本类型,但不是通过使用反射(性能至关重要)。
例如:
public class User
{
public int Id { get; set; }
public string FirstName { get; set; }
}
public class Vehicle
{
public int Id { get; set; }
public string Label { get; set; }
}
在这种情况下,如果我有可用的 Id
属性,我会很高兴,无论我持有的是什么类型。
在 C# 中是否有任何方法可以实现与此类似的内容:
public static int GetId<T>(T entity) where T // has an int property 'Id'
{
return entity.Id;
}
我想我本可以使用dynamic
,但是,我正在寻找一种方法来限制代码在编译时将此方法用于具有没有 Id
属性。
最佳答案
您可以使用接口(interface):
public interface IHasId
{
int Id { get; }
}
public class User : IHasId { ... }
public class Vehicle : IHasId { ... }
public static int GetId<T>(T entity) where T : IHasId
{
return entity.Id;
}
但是,如果您不能修改类来添加接口(interface),您将无法执行此操作。没有编译时检查会验证属性是否存在于 T
上。您必须使用反射 - 这很慢而且显然不理想。
关于c# - 可以在没有基类型的情况下使用 C# 约束吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15814746/