匿名对象作为泛型类型

Anonymous object as generic type

提问人:Silas 提问时间:7/26/2023 更新时间:7/26/2023 访问量:34

问:

我有以下通用接口:

public interface IDatabaseEntity<out T>
{
    public T GetKey();
}

现在,我定义了几个实体,它们都实现了这个接口。举个例子:

public class Player : IDatabaseEntity<Guid>
{
    public Guid Id { get; set; }
    // Other fields...

    public Guid GetKey() => Id; // Implement the interface
}

这一切都很好,但现在我有一个由多个字段唯一定义的实体。因此,我需要以下一些东西:

public class SessionRecord : IDatabaseEntity<{Guid GameId; Guid PlayerId; DateTimeOffset StartDate}>
{
    public Guid            GameId    { get; set; }
    public Guid            PlayerId  { get; set; }
    public DateTimeOffset  StartTime { get; set; }
    public DateTimeOffset? EndTime   { get; set; }


    public object GetKey() => new { GameId, PlayerId, StartTime }; // Implement the interface
}

基于这个答案,我相信这样的事情可能是可能的,因为编译器因此可以区分“对象”和匿名类型。

如何使接口中的方法返回匿名对象,以及 Guids 或字符串等?

C# 泛型 层次结构 anonymous-objects

评论

3赞 Jon Skeet 7/26/2023
您是否考虑过使用元组类型而不是匿名类型?
1赞 EddieDemon 7/26/2023
我认为您将对象列表与动态对象混淆了。正如 Jon 所说,元组或类似的东西在这里会更有意义。
0赞 Silas 7/26/2023
好吧,我会被诅咒的。谢谢大家!我仍然想知道这是否可能,所以我将保留我的问题。

答:

2赞 Peter 7/26/2023 #1

如果能像这样创建一个模型,那就太好了

 public class TestModel {
    public Guid GameId;
    public Guid PlayerId;
    public DateTimeOffset StartDate;
}

并像这样使用它

public class SessionRecord : IDatabaseEntity<TestModel>
{
    public Guid            GameId    { get; set; }
    public Guid            PlayerId  { get; set; }
    public DateTimeOffset  StartTime { get; set; }
    public DateTimeOffset? EndTime   { get; set; }


    public TestModel GetKey() => new TestModel(); // Implement the interface
}

编辑 18:63

public class SessionRecord : IDatabaseEntity<object>
{
    public Guid            GameId    { get; set; }
    public Guid            PlayerId  { get; set; }
    public DateTimeOffset  StartTime { get; set; }
    public DateTimeOffset? EndTime   { get; set; }


    public object GetKey() => new { GameId, PlayerId, StartTime }; // Implement the interface
}

评论

0赞 Silas 7/26/2023
一般来说,这将是答案,但出于某种利基原因,我确实要求该对象可以传递给 EFCore,作为我可以唯一标识数据库实体的对象。类或其他包装器在那里不起作用id