相关疑难解决方法(0)

C#中可能的部分泛型类型推断?

我正在为我的IoC类库重写我的流畅界面,当我重构一些代码以便通过基类共享一些常用功能时,我遇到了麻烦.

注意:这是我想要做的事情,而不是我必须做的事情.如果我必须使用不同的语法,我会,但如果有人知道如何使我的代码按我想要的方式编译,那将是非常受欢迎的.

我希望某些扩展方法可用于特定的基类,并且这些方法应该是通用的,具有一个泛型类型,与方法的参数相关,但是这些方法也应该返回与特定后代相关的特定类型.被引用.

使用代码示例比上面的描述更好.

这是一个简单而完整的例子,不起作用:

using System;

namespace ConsoleApplication16
{
    public class ParameterizedRegistrationBase { }
    public class ConcreteTypeRegistration : ParameterizedRegistrationBase
    {
        public void SomethingConcrete() { }
    }
    public class DelegateRegistration : ParameterizedRegistrationBase
    {
        public void SomethingDelegated() { }
    }

    public static class Extensions
    {
        public static ParameterizedRegistrationBase Parameter<T>(
            this ParameterizedRegistrationBase p, string name, T value)
        {
            return p;
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            ConcreteTypeRegistration ct = new ConcreteTypeRegistration(); …
Run Code Online (Sandbox Code Playgroud)

c# generics fluent-interface type-inference

20
推荐指数
2
解决办法
4616
查看次数

是否有可能需要开放的通用接口的通用约束?

我正在实现一个存储库,并且一直在想使它对用户更友好。现在,我有一个IEntity指定Id字段的接口:

public interface IEntity<T>
{
    T Id { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我的存储库允许用户通过该ID获取新实例。现在它可以处理的类型需要实现IEntity接口,因此我对存储库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;
    }
}
Run Code Online (Sandbox Code Playgroud)

T和之间存在一个明显的关系,U并且编译器充分理解它可以标记未使用情况,但不足以启用类型推断-每次调用都Get需要显式指定泛型参数。我知道没有办法指定T,但是如何改善方法签名,以便U不需要指定呢?现在,对于最常见的用法,我有一个重载:

public T Get<T>(int id) where T : IEntity<int>
{
    return Get<T, int>(id);
}
Run Code Online (Sandbox Code Playgroud)

我想知道是否可以通过某种方式将开放的通用接口指定为约束,或者对于一般情况,哪种方法更好?

c# generics type-inference

5
推荐指数
1
解决办法
990
查看次数

标签 统计

c# ×2

generics ×2

type-inference ×2

fluent-interface ×1