【C#泛型设计的一个小陷阱.】教程文章相关的互联网学习教程文章

c# – 如何用Java编写泛型方法【代码】

如何用Java编写泛型方法. 在C#中,我会这样做public static T Resolve<T>(){return (T) new object();}什么是Java中的等价物?解决方法:首先,你的C#示例是错误的;除非typeof(T)== typeof(object),否则它将抛出InvalidCastException.您可以通过添加constraint来修复它:public static T Resolve<T>() where T : new() {return new T(); }现在,这将是Java中的等效语法(或者,至少,尽可能接近):public static <T> T Resolve() {return ...

c# – 在泛型方法中返回特定类型【代码】

我写了以下方法:public T CreatePackage<T>() where T : new() {var package = new T();if (typeof(ComponentInformationPackage) == typeof(T)){var compInfoPackage = package as ComponentInformationPackage;// ...return compInfoPackage;}throw new System.NotImplementedException(); }我检查T是什么类型,根据这个我对待我的变量包.当我想要返回它时,我得到编译器错误. “ComponentInformationPackage类型不能隐式转换为T”...

c# – 这是使用泛型检查空值的最佳方法吗?【代码】

public static T IsNull<T>(object value, T defaultValue) {return ((Object.Equals(value,null)) | (Object.Equals(value,DBNull.Value)) ?defaultValue : (T)value); }public static T IsNull<T>(object value) where T :new() {T defaultvalue = new T();return IsNull(value, defaultvalue); } 已经过测试,可以用来对付数据对象,类和变量.只是想知道是否有更好的方法来解决这个问题.解决方法:看起来你正试图复制null coalesce...

c# – 具有相同名称和参数但具有不同结果和约束的多个泛型方法【代码】

我目前正在重写自定义RPC机制的一部分(不能被其他东西替换,所以不建议;-)).调用的参数收集在内部使用字典的自定义集合中.有一个方法T Get< T>(string)来检索命名参数.对于可选参数,我想添加一个返回参数的TryGet< T>(字符串)方法,如果它不存在则添加null,以便调用代码可以使用null合并运算符提供默认值.当然,对于值类型,这不起作用,但我可以使用T?相反,这就是我想要的. 所以我拥有的是:public class Arguments {// lots of other...

c# – 如何根据泛型T的类型返回值【代码】

我有一个方法,如:public T Get<T>(string key) {}现在说如果类型是字符串,我想返回“hello”,如果是int类型则返回110011. 我怎样才能做到这一点? typeof(T)似乎不起作用. 理想情况下,我想做一个switch语句,并根据泛型的类型返回一些东西(string / int / long / etc). 这可能吗?解决方法:以下应该有效public T Get<T>(string key) { object value = null;if ( typeof(T) == typeof(int) ) { value = 11011;} else if ( typeof(T)...

c# – 泛型或只是使用重载?【代码】

我有3个类,都有相似的属性.所有3个类中的3个属性的名称完全相同.相反,写3种方法(每个类一个)是否有某些方法可以在这里使用泛型?public static String GetAString(ActivityMedia activityMedia) {return activityMedia.name; }public static String GetAString(AuditMedia auditMedia) {return auditMedia.name; }public static String GetAString(VehicleMedia vehicleMedia) {return vehicleMedia.name; }编辑:显然,目的是简单地...

c# – 关于泛型,继承和链接的棘手问题【代码】

对于上下文 – read this. 问题:class Program{static void Main(){var b = new bar();b.buzz().fizz().buzz().fizz(); //cool// ^FAIL!!!...<------------------------------------Console.ReadLine();}}public class foo{public foo fizz() { return this; }}public class bar : foo{public bar buzz(){return this;}}解:class Program{static void Main(){var b = new bar();b.buzz().fizz().buzz().fizz(); //...

如何在C#中创建一个侵入式树类使用泛型?【代码】

在C#中,我有一个看起来像这样的侵入式树结构:public abstract class Node {Container parent;Node nextNode;Node previousNode;public abstract class Container : Node{Node firstChild;Node lastChild;} }可以添加到树中的各种对象继承自Node或Container,具体取决于它们是否可以有子项. 通过使Container成为内部类,这意味着它可以访问Node中的私有成员来管理容器的子列表. 这一切都很好.但是现在我希望它能够通用,以便我可以在保...

带有IronPython类型参数的C#泛型【代码】

所以,情况是我有一个名为Foo的C#泛型类,其模板参数T具有new()约束.我已经宣布我的课程是这样的:class Baz {public Baz() { } }class Foo<T>where T : Baz, new() {// blah blah }在Python中:class Bar(Baz):def __init__(self):""" do various things here """但是,如果在Python中我尝试做Foo [Bar],我会收到一个错误,告诉我我的Bar类违反了Foo< T>上的约束(即new()约束). 是什么赋予了?解决方法:IronPython对象没有默认构造函数...

如何在C#XML摘要中显示泛型类型【代码】

/// <summary> /// Something about this generic method which works with ??? type. /// </summary> /// <typeparam name="T">???</typeparam> /// <returns></returns> public T Foo<T>() {??? }是否可以在摘要标记中编写注释以显示当前给定的泛型类型. (正如visual-studio所做的那样)? (例如,在Foo< string>()的工具提示中,我们可以看到有关此泛型方法的一些内容,它适用于字符串类型.)解决方法:这个标签应该这样做< typeparam...

c# – 获取已关闭的未创建泛型方法的标记【代码】

我正在使用MethodBuilder.SetMethodBody()来发出方法,而不是使用内置的ILGenerator.原因主要是对异常处理信息进行更多控制,并且通常对发出的操作码有更多控制. 在我需要调用方法的所有情况下,我正在调用ModuleBuilder.GetMethodToken()并且它工作正常,除非我需要调用一个未创建的封闭泛型方法(使用相同的动态模块).它抛出NotSupportedException:不支持指定的方法.. 当然,MethodBuilder.TokenMetadata不起作用,因为该方法是未创建的...

c#-泛型-接口协变、抗变【代码】【图】

代码 using System; // 协变 public interface IA<out T> where T:new() {T fun();//void fun(T t);//err } // 抗变 public interface IB<in T>{void fun(T t);//T fun();//err } class A:IA<C>{public C fun(){return new C();} } class B:IB<C>{public C c;public void fun(C c){this.c = c; } } class C{public int a = 5; } public class Fanxing{public static void Main(){Console.WriteLine("hello word");A a = new A()...

c#-泛型-静态成员【代码】【图】

代码 using System; class A<T>{public static int a = 5; } public class Fanxing{public static void Main(){Console.WriteLine("hello word");A<int> a = new A<int>();Console.WriteLine("A<int>.a:"+A<int>.a);A<string> b = new A<string>();A<string>.a = 6;Console.WriteLine("A<string>.a:"+A<string>.a);Console.WriteLine("A<int>.a:"+A<int>.a);} }

c#-泛型-约束(new)【代码】【图】

代码 using System; class A<T> where T:new(){public static int a = 5;public T fun(){return new T();} } class B{public int a = 5; } public class Fanxing{public static void Main(){Console.WriteLine("hello word");A<B> ab = new A<B>();B b = ab.fun();Console.WriteLine(b.a);} }

c# – 如何使用泛型访问EF 6中的实体?【代码】

我试图弄清楚如何使用泛型从查找表中选择值,并在运行时将实体名称作为字符串传递.这是我到目前为止所拥有的.我遇到的问题是“var codes = Select();”线.你可以猜到,编译器不满意并给我一个错误:classType是一个变量,但用作一个类型.我不知道该怎么做或如何解决它.我无法对接口或类名进行硬编码,因为在解析字符串之前我不知道代码表的签名.任何指导将不胜感激!public void GetTableNameObject(string TableName) {dynamic classT...