【c#-声明具有限制类型的泛型字典】教程文章相关的互联网学习教程文章

c# – 泛型上的InvalidCastException【代码】

来自Java世界,使用泛型和C#进行编程通常是一个令人头疼的问题.像这个:interface ISomeObject { } class SomeObjectA : ISomeObject { } class SomeObjectB : ISomeObject { }interface ISomething<T> where T : ISomeObject {T GetObject(); } class SomethingA : ISomething<SomeObjectA> {public SomeObjectA GetObject() { return new SomeObjectA(); } } class SomethingB : ISomething<SomeObjectB> {public SomeObjectB Get...

c# – 使用多个泛型类型参数进行类型推断【代码】

我不明白为什么C#在以下完整情况下不会推断出类型:public interface IThing {}public class Thing1 : IThing {}public class Thing2 : IThing {}public interface IContainer {}public class Container1 : IContainer {public IThing A { get { return new Thing1(); } }public IThing B { get { return new Thing2(); } } }public class Container2 : IContainer {public IThing C { get { return new Thing1(); } }public IThin...

c# – 动态调用泛型目标上的方法【代码】

我有一个通用接口ICommandHandler<>每个都有许多实现来处理ICommand的特定实现,例如:public class CreateUserCommand : ICommand { ... } public class CreateUserCommandHandler : ICommandHandler<CreateUserCommand> { ... }当我给出一个ICommand对象时,我正试图将它动态地分配给正确的ICommandHandler.目前我在调度程序类中使用了一个非常简单的反射方法和一个Invoke:public void Dispatch<T>(T command) where T : ICommand...

c# – 确定类是否是具有多个泛型参数的类型的子类【代码】

给定以下类层次结构public abstract class MyGenericClass<T1, T2> {public T1 Foo { get; set; }public T2 Bar { get; set; } }public class BobGeneric : MyGenericClass<int, string>{} public class JimGeneric : MyGenericClass<System.Net.Cookie, System.OverflowException>{}我原以为我可以做到以下几点//All types in the assembly containing BobGeneric and JimGeneric var allTypes = _asm.GetTypes(); //This works...

c# – 在泛型类中使用typeof【代码】

我创建这样的Generic类:public class Sample<T> where T : class {public DoSomething(); }然后我创建新类:public class Sample2 {Sample<Sample2> obj=new Sample<Sample2>(); }为什么我不能使用下面的代码在Sample2类中创建Sample类的实例?Sample<typeof<this>> obj=new Sample<typeof<this>>();解决方法:答案很简单泛型需要编译时间,但是你在编译时显然不知道你正在做什么

c# – 应用泛型方法的错误【代码】

参考我的previous question,我调整了我的代码以使用泛型FileHelperEngine engine; public DateTime ExportResultsToCsv<T>(string filePath, string HeaderLine, List<T> data) {engine = new FileHelperEngine(typeof(T)) { HeaderText = HeaderLine };engine.WriteFile(filePath, data);return DateTime.Now; }但是,当我尝试将其集成到我的代码中时,我面临以下2个错误:Error 1 The best overloaded method match for‘F...

c#泛型和非泛型方法之间的重载决策【代码】

我在互联网和stackoverflow上做了一些基本搜索,当涉及泛型版本方法和非泛型版本方法时,我看到了很多关于重载解析的讨论.我知道重载解析是在编译时完成的 – 因此如果我有这个代码:public class A<T> {public void DoStuff(T value){InternalDoStuff(value);}protected void InternalDoStuff(int value){Console.WriteLine("Non-generic version");}protected void InternalDoStuff(T value){Console.WriteLine("Generic version")...

c# – 为复杂泛型类型创建类或接口【代码】

我正在尝试为一种对象列表列表创建别名.具体来说,我想缩短我必须为这种类型做的所有输入:IReadOnlyList<IReadOnlyList<MyObject>>我的尝试在这里得到证明:using System.Collections.Generic;namespace MyApp {class Program{public class MyObject{public static IMyCollection GetCollection(){var a = new List<MyObject>();a.Add(new MyObject());var b = new List<IReadOnlyList<MyObject>>();b.Add(a.AsReadOnly());return ...

c# – 重写泛型方法的约束【代码】

我试图理解约束(类或泛型方法)如何影响方法本身.以此代码为例:class Base<T> where T:class, IComparable<T> {public virtual void Method(T obj) { } }class Derived<T> : Base<T> where T:class, IComparable<T>, IEnumerable<T> {public override void Method(T obj) { } }此代码编译良好,编译器/运行时能够解析对非泛型方法“Method”的多态调用,该方法采用泛型类型的参数.在基类和派生类中,类型参数的约束是不同的. 我还指定...

在泛型类的方法中比较两个T的变量(从C到C#的代码端口)【代码】

如何在泛型类的方法中比较两个类型为T的变量< T,U>?这是一个抛出以下编译器错误的示例代码:Error CS0019 Operator ‘>=’ cannot be applied to operands of type ‘T’and ‘T’class IntervalSet< T, U > {public void Add ( T start, T end, ref U val ){// new interval is empty?if (start >= end) // ERRORreturn; } }我尝试将源码从C语言移植到C#,而C#对我来说是新的.谢谢你的帮助.解决方法:你必须告诉C#T是可比较的,否则...

c# – 嵌套泛型>【代码】

为什么写这样的东西是不可能的:T1<T2> Method<T1, T2>(T1<T2> genericValue) { ... }例如,我想编写一个扩展方法,它接受一个通用对象,包含一个通用的集合:Container<CT<T>> ExtensionMethod<CT, T>(Container<CT<T>> value) { ... }其中CT可以是Array,List或任何其他集合类型,T是任何类型.但编译器说“类型参数T1没有类型参数”. 那有什么解决方法吗?解决方法:这是不可能的.您的泛型必须为任何T编译.因此,如果您对T进行任何假设而...

c# – 如何使用反射找到特定的泛型重载?【代码】

我正在尝试创建一个将调用特定泛型重载方法的Expression(在我的第一个测试用例中为Enumerable.Average).特定类型绑定直到运行时才知道,因此我需要使用Reflection来查找和创建正确的泛型方法(Expression是从解析后的文本创建的). 所以,如果我在运行时知道我想找到这个特定的重载:public static double Average<TSource>(this IEnumerable<TSource> source, Func<TSource, int> selector)如何使用反射解析特定的MethodInfo? 到目前...

c# – 带有IDictionary和IEnumerable的嵌套泛型【代码】

在内部可重用库的通用C#类中,我想传递一个引用“映射到其他东西列表的东西”.那里传递的内容的数据类型不应该被库知道.此外,它们的存储方式也不应该是已知的,即今天的内存中保存的列表,以后可能是从按需读取的数据库表. 所以我以为我会写这个库类:class GenericClass<T, U> {public void Foo(IDictionary<T, IEnumerable<U>> bar){// do something} }这会编译,但尝试传递具体实现不会:class UsingClass {public static void Main...

是否可以在C#泛型方法中定义“不可为空”的约束?【代码】

在C#中,Nullable< T> type不满足where struct generic约束(而AFAK这在技术上是一个struct).这可用于指定泛型参数必须是不可为空的值类型:T DoSomething<T>() where T : struct {//... } DoSomething<int?>(); //not ok DoSomething<int>(); //ok当然,Nullable< T>也不满足类约束的引用类型:T DoSomething<T>() where T : class {//... } DoSomething<int?>(); //not ok DoSomething<Foo>(); //ok这是否可以定义约束,例如它必...

c# – 取消装箱-1并使用泛型强制转换为Nullable会产生InvalidCastException【代码】

在this SO post中,我找到了一个通用扩展方法,如果SqlDataReader读取的值为null或DBNull.Value,则返回默认值,否则返回正确转换的值.我这样实现了:public static T GetValueOrDefault<T>(this SqlDataReader reader, string columnName, T defaultValue = default(T)) {object val = reader[columnName];if (val == null || val == DBNull.Value){return defaultValue;}return (T)val; }下面提到的上面提到的帖子中的方法没有使用正...