Tag: generics

C#中的通用inheritance类型限制

我有一个不太优雅的解决方案,我需要的,但我正在寻找一个优雅的解决方案来取代它。 以下代码无法编译,但代表了我想要做的事情: interface IWebService { } abstract class BaseClient { } class SpecializedClient : BaseClient { } class ClientHelper where T : BaseClient { } 其中ClientHelper中的ClientHelper是任何扩展BaseClient类,无论传入的模板类型如何。 我找到的不优雅的解决方案是: class ClientHelper where T : BaseClient {} 这变得不优雅的原因是我的项目最终得到了类似于以下的类: class MyClass where A : MyBaseClass 一直到一个类型的基类。 这只是具有generics类的复杂inheritance树的成本,还是有更简单的方法来保留模板化类型的类型限制?

SkipList vs Dictionary

我最近一直在阅读Skip Lists。 我有一个Web应用程序,它对静态数据集执行非常复杂的Sql查询。 我想实现一个缓存系统,我生成sql查询的md5哈希值,然后返回查询的缓存数据集(如果它存在于集合中)。 哪种算法会更好,Dictionary还是SkipList? 为什么? http://msdn.microsoft.com/en-us/library/ms379573%28VS.80%29.aspx#datastructures20_4_topic4

C#:私有内部接口可能吗?

我有一个通用类X ; 这个类有一个协变部分,我希望能够协同访问。 所以我把它分解成一个接口IX 。 但是,我希望这个接口只对类本身可见,因为它还包含private 。 即,在课堂内部,我可以向上升到IX并且共同使用它。 例如: class X : IX { private interface IX{ // the private covariant interface void foo(); } // It grants access to the private method `foo` private T foo(){…} public T IX.foo(){ return foo(); } private static void someMethod(IX x) { // Here I can use `x` […]

C#抽象通用方法

C#,。net 3.5 我正在尝试创建一个具有generics方法的基类。 从中inheritance的类应指定方法的类型。 这样做的前提是创建管理过滤的类。 所以我有: public abstract class FilterBase { //NEED Help Declaring the Generic method for GetFilter //public abstract IQueryable GetFilter(IQueryable query); } public class ProjectFilter:FilterBase { public IQueryable GetFilter(IQueryable query) { //do stuff with query return query; } } public class ProjectList { public static ProjectList GetList(ProjectFilter filter) { var query = […]

从通用抽象类派生的类的C#方法重载问题

我正在研究一个项目,我有一个通用的抽象类型,它接受一个类型参数,它本身是从抽象类型派生的。 如果你想知道为什么我会这样做,请看这个问题 。 我遇到了一个有趣的问题,即在抽象类中定义的派生类中重载方法。 这是一个代码示例: public abstract class AbstractConverter where U : AbstractConvertible where T : AbstractConverter { public abstract T Convert(U convertible); } public class DerivedConvertibleConverter : AbstractConverter { public DerivedConvertibleConverter(DerivedConvertible convertible) { Convert(convertible); } public override DerivedConvertibleConverter Convert(DerivedConvertible convertible) { //This will not be called System.Console.WriteLine(“Called the most derived method”); return this; } […]

当类使用generics和generics类型参数时,如何获取正确的MethodInfo对象

我想知道是否有人能够演示如何使用Type的GetMethod()方法来检索以下签名的MethodInfo对象: Class.StaticMethod(T arg1, IInterface1 arg2, IEnumerable arg3) 谢谢, XAM

切换案例和generics检查

我想编写一个函数,将int和decimal格式化为不同的字符串 我有这个代码: 我想把它重写为generics: public static string FormatAsIntWithCommaSeperator(int value) { if (value == 0 || (value > -1 && value < 1)) return "0"; return String.Format("{0:#,###,###}", value); } public static string FormatAsDecimalWithCommaSeperator(decimal value) { return String.Format("{0:#,###,###.##}", value); } public static string FormatWithCommaSeperator(T value) where T : struct { string formattedString = string.Empty; if (typeof(T) == typeof(int)) […]

在.NET中隐藏inheritance的通用接口成员:好,坏还是难看?

我知道类实现中的阴影成员可能导致“错误”成员可以被调用的情况,这取决于我如何构建我的实例,但是对于接口我没有看到这可能是一个问题,我发现自己编写接口像这样经常这样: public interface INode { IEnumerable Children { get; } } public interface INode : INode where N : INode { new IEnumerable Children { get; } } public interface IAlpha : INode { } public interface IBeta : INode { } 我的代码中有一些地方只知道INode所以孩子们也应该是INode类型。 在其他地方我想了解具体的类型 – 在我的示例IAlpha和IBeta接口的实现中,我希望子类型与其父类型相同。 所以我实现了一个NodeBase类: public abstract class NodeBase : INode where N […]

连续的内存存储误解在.NET?

http://msdn.microsoft.com/en-us/library/ms379570(v=vs.80).aspx 我知道.net中的Arrays是以连续的方式存储的。 (在mem中) 我也知道List不是。 (好吧……不是所有列表类型……请参阅我的第2个问题) 从这里我有2个问题 我知道在4,8,16 …插入项目到列表后 – 该列表在内存中reallocate自己。 我也知道我可以向他发送Capacity ,以便让他知道我将创建他的大小(以减少重新分配)。 问题是为什么 ? 他不会连续存放自己,为什么他关心重新分配自己呢? (他不必找到免费和连续的存储单元) 为什么带有结构的List是否在连续内存中分配,与类列表不同?

在C#中将string.Empty转换为(generic)T?

我有一个实用程序方法,它使用签名从旧的.INI配置类型文件返回强类型值 internal static T GetIniSetting(string config, string key, T defVal = default(T)) 我希望字符串是特殊的,因为我希望defaultValue的默认值是string.Empty ,而不是default(string) (即null),在编码器没有指定默认值的情况下。 if (cantFindValueInIniFile == true) { if ((typeof(T) == typeof(string)) && (defaultValue == null)) { // *** Code needed here – Cannot convert string to *** return (T)string.Empty; } return defaultValue; } 我已经尝试过强制转换,而as关键字也无济于事。