gpt4 book ai didi

c# - 是否可能有一个需要开放通用接口(interface)的通用约束?

转载 作者:太空狗 更新时间:2023-10-29 23:22:34 24 4
gpt4 key购买 nike

我正在实现一个存储库,并一直想知道如何让它对用户更友好一些。现在我有一个 IEntity 接口(interface),它指定了一个 Id 字段:

public interface IEntity<T>
{
T Id { get; set; }
}

我的存储库允许用户通过该 ID 获取新实例。现在它可以处理的类型需要实现 IEntity 接口(interface),所以我对存储库 Get 方法有一个通用约束:

public class Repository
{
public T Get<T, U>(U id) where T: IEntity<U>
{
// fake implementation, but T is required at compile time
var result = Activator.CreateInstance<T>();
result.Id = id;
return result;
}
}

TU 之间存在明显的关系,编译器可以很好地理解它以标记错误使用,但不足以启用类型推断 - 每次调用 Get 需要明确指定通用参数。我知道没有办法绕过指定 T,但是我怎样才能改进方法签名以便不需要指定 U?现在我有一个最常见用法的重载:

public T Get<T>(int id) where T : IEntity<int>
{
return Get<T, int>(id);
}

我想知道是否有可能以某种方式指定一个开放的通用接口(interface)作为约束,或者对于一般情况来说什么是更好的方法签名。

最佳答案

看完Partial generic type inference possible in C#?Working around lack of partial generic type inference with constraints ,我认为 Marc Gravell 的解决方案是最接近合理的。通过辅助类(用于捕获第一个参数的类型)和 Grax 建议的扩展方法推断来获取他的部分通用参数应用程序,我最终得到了一个 Repository 实现

public class Repository
{
public T Get<T, TId>(TId id) where T: IEntity<TId>
{
// fake implementation, but T is required at compile time
var result = Activator.CreateInstance<T>();
result.Id = id;
return result;
}

public GetHelper<T> Get<T>()
{
return new GetHelper<T>(this);
}
}

有 helper

public struct GetHelper<T>
{
internal readonly Repository Repository;

public GetHelper(Repository repository)
{
Repository = repository;
}
}

public static class RepositoryExtensions
{
public static T ById<T, TId>(this GetHelper<T> helper, TId id)
where T : IEntity<TId>
{
return helper.Repository.Get<T, TId>(id);
}
}

用法看起来像这样:

var intEntity = repository.Get<IntEntity>().ById(19);
var guidEndtity = repository.Get<GuidEntity>().ById(Guid.Empty);

就我目前对泛型参数推断在 C# 中的工作方式的理解而言,不可能获得部分推断。

关于c# - 是否可能有一个需要开放通用接口(interface)的通用约束?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25303170/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com