社区
C#
帖子详情
有关泛型类调用的问题
chentank
2012-08-31 04:11:15
我现在在一个窗体中需要通过调用一个实例化的泛型类来完成功能。
现有一个窗体A 一个泛型类B<T> 所有的功能都封装在该类中
如何能够把泛型类B<T>的实例传送给窗体A,并让A能够调用?
...全文
187
19
打赏
收藏
有关泛型类调用的问题
我现在在一个窗体中需要通过调用一个实例化的泛型类来完成功能。 现有一个窗体A 一个泛型类B 所有的功能都封装在该类中 如何能够把泛型类B的实例传送给窗体A,并让A能够调用?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
19 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
qldsrx
2012-09-04
打赏
举报
回复
你仔细看下dynamic的解释和用法,那个其实并不是一个数据类型,而是代表运行时解释的一个关键字,如果用typeof(dynamic)查看其类型的话,等价于typeof(object),object是不受任何约束的,但是运行时代表了一个真实类型而不是object,因此可以直接通过点号访问内部所有成员。
chentank
2012-09-03
打赏
举报
回复
[Quote=引用 14 楼 的回复:]
引用 10 楼 的回复:
是不是这样的:
在A中定义 dynamic b = new Object();
b = 泛型类的实例;
然后通过b来调用相关功能?
定义只要dynamic b;或者dynamic b = null;
后面调用直接b = 泛型类的实例;
然后判断b!=null的时候,就直接用b.xxx来访问,只不过你写代码的时候,没有语法提示,会告诉你行为……
[/Quote]
dynamic不支持类似泛型约束的机制么?
showjim
2012-08-31
打赏
举报
回复
怎么也看不明白楼主想要干什么?楼主最好贴一段你认为不好的代码,错误的也行,好让别人知道你想干什么?
qldsrx
2012-08-31
打赏
举报
回复
[Quote=引用 10 楼 的回复:]
是不是这样的:
在A中定义 dynamic b = new Object();
b = 泛型类的实例;
然后通过b来调用相关功能?
[/Quote]
定义只要dynamic b;或者dynamic b = null;
后面调用直接b = 泛型类的实例;
然后判断b!=null的时候,就直接用b.xxx来访问,只不过你写代码的时候,没有语法提示,会告诉你行为要在运行时才会解析。
stonespace
2012-08-31
打赏
举报
回复
不过B<T> a=new B<T>();可能无法通过编译,一般来说,创建泛型的实例,要用反射,
stonespace
2012-08-31
打赏
举报
回复
另外一个解决方案是把A中需要用到不确定T参数的功能提取出来,作为泛型方法,
比如
class A
{
private int Func<T>(T a)
{
B<T> a=new B<T>();
//....
}
}
stonespace
2012-08-31
打赏
举报
回复
[Quote=引用 5 楼 的回复:]
对A来说 如何能知道B<T>实例中T的类型?这才是问题所在 这里T可能是我自己写的具有相同接口的多个类
如果按stonespace的这种方法,那我就需要在A中把所有T类型都定义一次,
有没有更好的办法呢?
[/Quote]
如果对A来说,T参数是不确定的,你应该把A定义为泛型,A<T>,然后里面可以使用B<T>作为变量方法参数返回值,
但A是窗体,窗体无法定义为泛型,解决这个问题的办法是,把A中需要使用的不确定的T参数的功能提出来,封装成一个另一个泛型类C<T>,C<T>内部可以使用不确定T的B<T>作为变量参数和返回值,然后A在窗体中创建C<T>并调用方法,
chentank
2012-08-31
打赏
举报
回复
是不是这样的:
在A中定义 dynamic b = new Object();
b = 泛型类的实例;
然后通过b来调用相关功能?
chentank
2012-08-31
打赏
举报
回复
[Quote=引用 8 楼 的回复:]
你可以让你的泛型类继承接口啊,这样你将B<T>的实例通过接口在A中定义并调用即可。
另外C#4.0支持dynamic关键字,就不需要知道你的T是什么了,在运行时确定。
[/Quote]
我的T类型是有固定接口的,但是泛型类没有。使用dynamic我比较迷湖,能不能给个小例子
qldsrx
2012-08-31
打赏
举报
回复
你可以让你的泛型类继承接口啊,这样你将B<T>的实例通过接口在A中定义并调用即可。
另外C#4.0支持dynamic关键字,就不需要知道你的T是什么了,在运行时确定。
chentank
2012-08-31
打赏
举报
回复
如何使用适配器?给个小例子行不?
devmiao
2012-08-31
打赏
举报
回复
可以使用适配器,适配器接口实现泛型的逆变,然后传递这个适配器。
chentank
2012-08-31
打赏
举报
回复
[Quote=引用 4 楼 的回复:]
如果你想让A使用T参数已经确定的B实例,那么很简单,就像你用List<int>一样,把参数明确了,B<int>就相当于一个普通的class,像普通class一样用就可以,可以定义B<int>的变量,也可以作为参数,作为返回值都可以,只要T确定,
[/Quote]
对A来说 如何能知道B<T>实例中T的类型?这才是问题所在 这里T可能是我自己写的具有相同接口的多个类
如果按stonespace的这种方法,那我就需要在A中把所有T类型都定义一次,
有没有更好的办法呢?
stonespace
2012-08-31
打赏
举报
回复
如果你想让A使用T参数已经确定的B实例,那么很简单,就像你用List<int>一样,把参数明确了,B<int>就相当于一个普通的class,像普通class一样用就可以,可以定义B<int>的变量,也可以作为参数,作为返回值都可以,只要T确定,
stonespace
2012-08-31
打赏
举报
回复
既然已经实例化了,那么T是什么已经指定了,当然可以让A使用,不过A只能使用已经确定了T参数的B类实例,不能使用没有确定参数的泛型对象,
除非你把A也定义为泛型A<T>,不过A是窗体,你不能这么做,
天下如山
2012-08-31
打赏
举报
回复
直接实例化不行么?
B<int> ibt=new B<int>();
ibt.Methods();
bdmh
2012-08-31
打赏
举报
回复
A中声明B<T>类型变量不就行了,是这个意思吗,或者写个方法返回
解决C#
泛型类
参数无法
调用
带参数的构造函数的
问题
本文聚焦于C#
泛型类
参数无法带参数实例化的
问题
。指出C#存在创建变量类型实例时无法传入参数的限制,随后给出基于表达式目录树的解决方法,即动态构建委托,通过定义方法、构造表达式、编译生成委托并传入参数,最终生成T类型实例。
java
泛型类
继承_java
泛型类
的继承规则
本文深入探讨了Java中的
泛型类
使用,包括泛型方法、
泛型类
的实例化以及
泛型类
之间的关系。接着,讨论了
泛型类
与普通类的区别,如类型安全和多态性的实现。同时,介绍了
泛型类
的通配符概念,包括通配符的上限和下限,以及无限定通配符的应用。通过示例展示了通配符在方法
调用
中的限制,特别是对于`set`和`get`操作的不同处理。最后,讲解了通配符捕获的概念,用于解决泛型方法中的类型转换
问题
。
C#
泛型类
本文介绍了C#中的
泛型类
,泛型是一种通用表达方式,用于解决不同数据类型的共有代码。
泛型类
的定义包含占位符T,使用时指定类型,如Stack
。泛型的出现避免了装箱和拆箱带来的效率
问题
,以及通过Object类操作可能引发的隐含风险。泛型是延迟声明的,提高了代码效率,并在
调用
时指定参数类型。
C#泛型(三)——
泛型类
的功能
本文探讨了C#中
泛型类
的高级应用,包括如何使用default关键字解决null赋值
问题
,定义类型约束确保
泛型类
能正确
调用
特定方法,
泛型类
的继承方式,以及静态成员的注意事项。
java的枚举类的values_java – 使用
泛型类
Enum.values扩展枚举
在Java编程中,尝试使用枚举的`values()`方法初始化
泛型类
的数组,但Eclipse报错说该方法未定义。尽管枚举类确实有`values()`方法返回所有枚举值的数组,但在这种上下文中无法直接
调用
。一种解决方案是通过构造函数接收枚举值的数组。博客讨论了如何解决这个编译
问题
并利用枚举的特性在
泛型类
中正确使用`values()`方法。
C#
111,129
社区成员
642,541
社区内容
发帖
与我相关
我的任务
C#
.NET技术 C#
复制链接
扫一扫
分享
社区描述
.NET技术 C#
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
让您成为最强悍的C#开发者
试试用AI创作助手写篇文章吧
+ 用AI写文章