Tag: generics

获取通用对象参数的实际类型

毫无疑问,这个问题的元素之前已被问过,但我找不到答案。 (免责声明:这是相关的,但与我最近提出的问题不同)。 我有这样的方法: public static void Method(MethodInfo m, T value) { Type memberType = m.GetValueType(); if (memberType.IsAssignableFrom(typeof(List)) { object memberValue = Activator.CreateInstance(memberType); ((List)memberValue).Add(value); } } 当我这样称它时,这工作正常: string s = “blah”; Method(memberInfo, s); 但是,我需要使用generics类型调用此方法,所以我这样调用它: Type valueType = someType; object passValue = someMethod.MakeGenericMethod(new Type[] { valueType }).Invoke(this, new object[] { }); /* Call my original method */ […]

多个generics模糊

下面的代码是完全相同的,除了一个是C#,另一个是VB.Net。 C#编译得很好,但VB.Net会抛出警告: 接口’System.IObserver(Of Foo)’与另一个实现的接口’System.IObserver(Of Bar)’不明确,因为’接口IObserver(Of T)中的’In’和’Out’参数 为什么VB.Net显示警告而不是C#? 最重要的是,我该如何解决这个问题? Obs:我正在使用.Net Framework 4和Visual Studio 2010 Ultimate。 VB.Net代码: Module Module1 Sub Main() End Sub Public Class Foo End Class Public Class Bar End Class Public Class Beholder Implements IObserver(Of Foo) Implements IObserver(Of Bar) #Region “Impl” Public Sub OnCompleted() Implements System.IObserver(Of Bar).OnCompleted End Sub Public Sub OnError([error] As System.Exception) […]

必须实现一个小于和大于一般的操作

我绝对不能硬编码数据类型。 我需要严格的数据输入。 我必须使用TValue a <= TValue b。 再一次,绝对没有办法做某事像(双)a。 这是基本库实现的一部分。 关于泛型值的唯一具体事情是它们是静态类型。 IComparable和其他接口似乎不起作用。

实现多个通用接口 – 类型错误

我正在尝试做这样的事情: public interface IRepository { T Get(int id); } public interface IFooBarRepository : IRepository, IRepository { } IFooBarRepository repo = SomeMethodThatGetsTheActualClass(); Foo foo = repo.Get(1); 我收到警告: 类型参数“T”与外部类型“IRepository”中的类型参数同名 还有一个错误: 以下方法或属性之间的调用不明确:’IRepository.Get(int)’和’IRepository.Get(int)’ 关于如何使这种模式有效的任何想法?

如何允许C#方法的generics类型参数接受null参数?

private static Matcher EqualTo(T item) { return new IsEqual(item); } 如何修改上述方法定义,以使以下内容有效/允许。 EqualTo(“abc”); EqualTo(4); EqualTo(null); // doesn’t compile. EqualTo(null) does 尝试移植一些Java代码,其中null似乎是T参数的可接受值。 更新 谢谢:所有答案 – 尤其是Eamon和Jason。 我不希望方法调用打扰类型推断。 以下过载修复了它。 private static Matcher EqualTo(object item) { return EqualTo(item); } 实际上,上述问题是一个更大难题的一部分。 最终目标是让以下工作。 this.AssertThat(null, EqualTo(null)); this.AssertThat(null, Not(EqualTo(“hi”))); this.AssertThat(“hi”, Not(EqualTo(null))); 应用相同的修复.. RFC 。 (忽略丑陋的扩展方法部分 – 这是另一个问题。想要在没有inheritance的情况下在所有测试装置中使用这些方法。) public static void AssertThat(this object testFixture, […]

使用reflection调用包含通用参数的静态方法

执行以下代码时,我收到此错误“无法对ContainsGenericParameters为true的类型或方法执行后期绑定操作。” class Program { static void Main(string[] args) { MethodInfo MI = typeof(MyClass).GetMethod(“TestProc”); MI.MakeGenericMethod(new [] {typeof(string)}); MI.Invoke(null, new [] {“Hello”}); } } class MyClass { public static void TestProc(T prefix) { Console.WriteLine(“Hello”); } } 上面的代码只是我面临的实际问题的缩放版本。 请帮忙。

为什么接口不起作用,而抽象类却使用generics类约束?

下面的代码显示了一个带有类型约束的通用类( Pub )。 该类有一个可以引发的事件,允许我们向订阅者传递消息。 约束是消息必须实现IMsg (或者当它是抽象类时从IMsginheritance)。 Pub还提供了一个Subscribe方法,当且仅当对象实现了IHandler ,才允许对象订阅notify事件。 使用.NET 4,下面的代码显示baseImplementer.NotifyEventHandler上的错误,指出: “No overload for ‘IHandler.NotifyEventHandler(IMsg)’ matches delegate ‘System.Action'” 问题:(使用更新的订阅方法) 一旦我将`IMsg`更改为抽象类而不是接口,为什么错误会消失? public interface IMsg { } // Doesn’t work //public abstract class IMsg { } // Does work public class Msg : IMsg { } public class Pub where T : IMsg { public event Action notify; […]

将Type动态传递给

看,我有这样的情况…… object myRoledata = List() –> (some list or Ienumerable type) 现在我有一个通用方法,它从List创建一个XML对象 – 像这样的东西.. public string GetXML(object listdata) { List objLists = (List)Convert.ChangeType(listData, typeof(List)); foreach(var obj in listdata) { //logic to create xml } } 现在为了运行这个方法,我必须这样做: string xml = GetXML(myRoledata); 现在我不知道Type可能会传给GetXML方法。 我有一个方法可以为不同的Type调用GetXML ,例如Roles , Users等 现在我可以像这样获得List的Type Type genericType = obj.GetType().GetGenericArguments()[0]; 但不能像这样传递它 string xml = GetXML(myRoledata); […]

通用Web API控制器

我正在使用Web API v2,我有一些模型,我需要做CRUD操作。 例如,我有一个Allergy模型和一个Prescription模型。 在应用程序本身中,我有可以转换为适当模型的视图模型,但为了简单起见,我只想说我在Web API控制器中直接使用模型。 所以这样的事情: public class PrescriptionsController { public HttpResponseMessage Put(Prescription model) { // saved to the DB } … (other CRUD operations) } 我对Allergy模型也有同样的Allergy : public class AllergiesController { public HttpResponseMessage Put(Allergy model) { // saved to the DB } … (other CRUD operations) } 两种型号都有不同的属性,但处理方式完全相同 – 实际上我有大约3种其他型号,每种型号的处理方式完全相同。 我讨厌有5个不同的端点,基本上是复制和粘贴代码。 所以我的问题是: 我可以制作一个通用控制器来处理所有这些模型吗? […]

将IList 转换为BindingList

如何将IList列表转换为BindingList ?