Tag: generics

在Moq中为返回void的方法分配参数

在这个问题中 ,我发现这个答案似乎是向我解决问题的最佳方法。 提供的代码假定被模拟的函数返回一个值: bool SomeFunc(out ISomeObject o); 但是,我想要模拟的对象有一个out函数如下: void SomeFunc(out ISomeObject o); 来自上述答案的相关代码片段: public delegate void OutAction(out TOut outVal); public static IReturnsThrows OutCallback( this ICallback mock, OutAction action) where TMock : class { // … } Void不是TReturn的有效类型。 因此,我相信我必须以某种方式调整此代码,以使其与返回void的方法一起使用。 但是怎么样?

带有可选参数的构造函数违反new()约束

我有一个这个构造函数的类: public Currency(Guid? vcurrencyUI = null) : base(vcurrencyUI) { } 我想使用new()约束这个类,但我收到此错误: ‘Currency’必须是具有公共无参数构造函数的非抽象类型,才能在generics类型或方法中将其用作参数’T’… 如果我拆分构造函数一切正常: public Currency(Guid? vcurrencyUI) : base(vcurrencyUI) { } public Currency() : base() { } 为什么我需要拆分构造函数?

转换generics和generics类型

考虑一下,我有以下3个类/接口: class MyClass { } interface IMyInterface { } class Derived : IMyInterface { } 我希望能够将MyClass转换为MyClass ,反之亦然: MyClass a = new MyClass(); MyClass b = (MyClass)a; 但是如果我尝试,我会遇到编译错误: Cannot convert type ‘MyClass’ to ‘MyClass’ 我确信有一个很好的理由我不能这样做,但我想不出一个。 至于我为什么要这样做 – 我想象的场景是你理想地希望使用MyClass的实例来避免许多讨厌的演员,但是你需要将你的实例传递给一个接口接受MyClass 。 所以我的问题是双重的: 为什么我不能在这两种类型之间施放? 有没有办法保持使用MyClass实例的MyClass同时仍然可以将其转换为MyClass ?

如何检索generics方法的名称,包括generics类型名称

在C# ,我有一个带有以下签名的方法: List Load(Repository repository) 在Load()方法中,我想转储完整的方法名称(用于调试目的),包括generics类型。 例如:调用Load(); 会写”Load” 到目前为止我尝试了:使用MethodBase.GetCurrentMethod()和GetGenericArguments()来检索信息。 List Load(Repository repository) { Debug.WriteLine(GetMethodName(MethodBase.GetCurrentMethod())); } string GetMethodName(MethodBase method) { Type[] arguments = method.GetGenericArguments(); if (arguments.Length > 0) return string.Format(“{0}”, method.Name, string.Join(“, “, arguments.Select(x => x.Name))); else return method.Name; } 检索方法名称有效,但对于通用参数,它总是返回”T” 。 方法返回Load而不是Load (这是无用的) 我试图在GetMethodName() GetGenericArguments()之外调用GetGenericArguments()并将其作为参数提供,但它没有帮助。 我可以提供typeof(T)作为GetMethodName()的参数(它将起作用)但是它将特定于generics类型的数量,例如:使用Load它将不再起作用,除非我提供另一个论点。

类类型字典

我有一组类,每个类都可以使用外部应用程序打开不同类型的文件,并告诉该应用程序将文件打印到特定的打印机。 这些类都inheritance了一个公共抽象类和一个接口。 internal interface IApplicationPrinter : IDisposable { string ApplicationExe { get; } string ApplicationName { get; } string[] PrintableExtensions { get; } IApplicationPrinter CreateInstance(string Filename, string Printer); void Print(); bool ExitApplicationAfterPrint { get; set; } bool WaitApplicationExitOnPrint { get; set; } System.IO.FileInfo PdfFile { get; protected set; } } internal abstract class ApplicationPrinter : […]

通用显式转换失败C#

我对以下代码有一些问题。 我想将一个字符串显式化为一个对象,这是完全正常的,但是,如果此对象是generics类的一部分,则失败并出现以下错误exception:“无法转换类型为’System.String’的对象’输入’test.B’“。 即使我已经重载了该方法。 using System; using System.Collections.Generic; namespace test { class Program { static void Main(string [] args) { // These two cast perfectly fine. B x = (B) “abc”; C y = (C) “def”; A a = new A(); ab(); A b = new A(); bb(); } } class A { public List a […]

其中t:多个类

List Foo(Ilist list) where T : ?? 有没有办法强制执行T. 少数几个class级之一? 最后我想对T进行切换.. 谢谢。

当使用generics类型约束时,XmlSerializer抛出InvalidOperationException

当我尝试运行以下代码(两个分离的程序集)时 ClassLibrary.cs public interface ITest { } Program.cs中 using System; public class TestClass { public void Test(T x) where T : ITest { } } static class Program { static void Main(string[] args) { new System.Xml.Serialization.XmlSerializer(typeof(TestClass)); } } 使用以下命令在Windows 7 64位中编译: c:\ Windows \ Microsoft.NET \ Framework \ v2.0.50727 \ csc / target:library ClassLibrary.cs c:\ […]

C#列表通用扩展方法与非通用扩展方法

这是一个简单的问题(我希望),像List这样的集合类中有generics和非generics方法,它们具有Where和Where 。 例: List numbers = new List() { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; IEnumerable evens = numbers.Where((x) => { return x % 2 == 0; }); IEnumerable evens2 = numbers.Where((x) => { return x % 2 == 0; }); 为什么要使用一个(通用或非通用)?

如何将generics约束为类型枚举?

请考虑以下代码: class Base { //Base members } 我希望通用T是一个枚举(如果可能的话使用约束)。 我怎么能在C#中做到这一点? 编辑: 使用代码契约 – 由Akash Kava引入 – 似乎也是一种很好的方式。 我设法让它产生运行时错误,这是无用的。 这是我试过的代码。 应该可以生成编译时警告但我无法使其工作。