c# - 可以在没有基类型的情况下使用 C# 约束吗?

标签 c# dynamic reflection constraints

我有一些具有公共(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/

相关文章:

c# - 为什么委托(delegate)必须是静态的?

c# - 如何在不损失质量的情况下将 jpeg 转换为字节数组

c# - UpdateModel 无法正确转换 bool 值

c - **矩阵的工作方式与矩阵[行][列]有何不同?

c# - 动态创建类到cs文件?

c# - 在 C# 中调用动态 PSObject 属性会返回 RuntimeBinderException

java - 如何使用反射访问对象中的字段值

java - 如何在运行时将字符串转换为整数

java - 通过反射实例化静态抽象类

c# - 如何在使用依赖注入(inject)的 ASP.NET Core 2 中使用 OIDC 登录到 Azure AD 后添加自己的声明?