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