gpt4 book ai didi

c# - 开放通用约束

转载 作者:太空狗 更新时间:2023-10-29 19:47:48 25 4
gpt4 key购买 nike

给定以下界面:

public interface IQuerySpec<M> { }

我很想做一个这样的扩展方法:

public static OrderedSortation<T> OrderBy<T, TKey>(
this T query,
Expression<Func<T, TKey>> sort)
where T : IQuerySpec<?> {
//business as usual
}

我只是想确定类型 TIQuerySpec<M> 的一些变体.然后我可以按如下方式调用扩展方法:

public class Foo : IQuerySpec<int> {
public int SizeOfSailBoat {get; set;}
}

IQuerySpec<Foo> foo = new Foo {SizeOfSailBoat = 10}.
var result = foo.OrderBy(f => f.SizeOfSailBoat);

UDT Foo在上面的例子中指定了,但我不关心使用什么泛型类型参数。

有办法吗?

我尝试了以下方法:

public static OrderedSortation<T> OrderBy<T, M, TKey>(
this T query,
Expression<Func<T, TKey>> sort)
where T : IQuerySpec<M> {
//business as usual
}

上述方法有效,但需要明确说明通用参数才能调用“OrderBy”。我不想被要求明确说明通用参数。

我也试过这个:

public interface IQuerySpec {}
public interface IQuerySpec<M> : IQuerySpec {}

有了这些接口(interface),我就可以做到这一点:

public static OrderedSortation<T> OrderBy<T, TKey>(
this T query,
Expression<Func<T, TKey>> sort)
where T : IQuerySpec {
//business as usual
}

这几乎已经足够好了,除了我想隐藏非泛型 IQuerySpec 以便它在我的类库之外不可见。如果我能以这种方式确定非通用接口(interface)的范围,我会很高兴:

internal interface IQuerySpec {}

不幸的是,编译器不允许我这样做。

我猜想我想要的是不可能的,但以防万一。

最佳答案

问题是编译器无法从 T 或 T 从 M 隐式推断出 M 的类型。

所以你需要修复其中一个,这里我将 T 修复为 IQuerySpec<M>

扩展方法的签名变为

    public static OrderedSortation<IQuerySpec<M>> OrderBy<M, TKey>(
this IQuerySpec<M> query,
Expression<Func<IQuerySpec<M>, TKey>> sort)

{
//business as usual
}

举个例子

    class IntQSpec : IQuerySpec<int>
{
//your implementation
}

这是调用示例

var iQS = new IntQSpec();
//do whatever you want with iQS
var ord = iQS.OrderBy(ii=>ii.ToString());
//here I called OrderBy without the need to explicitly specifying the Generic Arguments

这里是你的代码在 visual studio 2013-2015 上的测试,没有突出显示的错误请注意,我访问了具体类型的 Z 字段 IntQSpec enter image description here

希望对您有所帮助。

关于c# - 开放通用约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33073633/

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