C# 上下文泛型

C# 上下文泛型,c#,generics,C#,Generics,我开始把这当作一个真正的问题来写,但我一直在想答案,我想我无论如何都会把它贴出来,看看是否还有其他解决办法 我能想到两个例子,其中泛型成为一种不必要的痛苦,我想知道是否有解决办法 例1 在本例中,我设法在实例化中强制使用正确的TKey,但为什么我不能调用newsomeclass()或newsomeclass()我的意思是TKey是可以推断的 可能的解决方案 我可以放弃泛型,在某些情况下这是有意义的(比如第一个例子)。在其他情况下,则不是这样,而是会产生内存或运行时开销(不必要地创建字段或强制转换

我开始把这当作一个真正的问题来写,但我一直在想答案,我想我无论如何都会把它贴出来,看看是否还有其他解决办法

我能想到两个例子,其中泛型成为一种不必要的痛苦,我想知道是否有解决办法

例1 在本例中,我设法在实例化中强制使用正确的
TKey
,但为什么我不能调用
newsomeclass()
newsomeclass()
我的意思是
TKey
是可以推断的

可能的解决方案 我可以放弃泛型,在某些情况下这是有意义的(比如第一个例子)。在其他情况下,则不是这样,而是会产生内存或运行时开销(不必要地创建字段或强制转换)或不必要的代码重复

我想到的另一个解决方案是创造这样的东西

public interface IPoco<TKey> 
{
    public TKey Id { get; set; }
}


public class SomePOCO : IPoco<int> 
{
    public int Id { get; set; }
}

public class PocoContext<TPoco, TKey>
   where TPoco : IPoco<TKey>
{
     TKey Key { get; set; }
     TPoco Poco { get; set; } 

     public PocoContext(TPoco poco)
     {
        Key = poco.Key;
        Poco = poco;
     }
}

public class SomeClassUsingPOCOAndId<TPocoContext>
{
}
公共接口IPoco { 公钥Id{get;set;} } 公共类SomePOCO:IPoco { 公共int Id{get;set;} } 公共类PocoContext TPoco所在地:IPoco { TKey{get;set;} TPoco Poco{get;set;} 公共PocoContext(TPoco poco) { Key=poco.Key; Poco=Poco; } } 使用PoCoAndId的公共类SomeClasses { } 这允许我减少实例化所需的代码量——但这取决于我对POCO的使用情况——为每种类型创建上下文可能会非常耗时


现在我想知道,有没有办法简化这个过程?也许是某种合成糖?在C#7或C#8上实现它需要什么?

在第二个示例中-因为类可以从多个接口派生,编译器不能在所有情况下推断类型。否则,向类中添加接口将以令人惊讶的方式破坏现有代码。很难理解您要做的是什么。似乎您试图创建任意约定(
IPoco
),然后想知道如何避免打破它们。通常,如果有一个很好的理由制定一个公约,它最终会被遵守。如果您想强制执行,请查看lint分析器、样式强制等。但我个人没有从您提供的示例代码中看到
IPoco
接口中的任何值。IPoco接口只是一个示例。关键是,当这个结构有意义时,并且它确实是imo(我更喜欢它而不是asp.net核心,它将
对象
作为
用户管理器
的Id返回),就很难维护了。
public interface IPoco<TKey> 
{
    public TKey Id { get; set; }
}

public class SomePOCO : IPoco<int> 
{
    public int Id { get; set; }
}

public class SomeClassUsingPOCOAndId<TPoco, TKey>
    where TPoco : IPoco<TKey>
{
}
public interface IPoco<TKey> 
{
    public TKey Id { get; set; }
}


public class SomePOCO : IPoco<int> 
{
    public int Id { get; set; }
}

public class PocoContext<TPoco, TKey>
   where TPoco : IPoco<TKey>
{
     TKey Key { get; set; }
     TPoco Poco { get; set; } 

     public PocoContext(TPoco poco)
     {
        Key = poco.Key;
        Poco = poco;
     }
}

public class SomeClassUsingPOCOAndId<TPocoContext>
{
}