有关泛型类调用的问题

chentank 2012-08-31 04:11:15
我现在在一个窗体中需要通过调用一个实例化的泛型类来完成功能。
现有一个窗体A 一个泛型类B<T> 所有的功能都封装在该类中
如何能够把泛型类B<T>的实例传送给窗体A,并让A能够调用?
...全文
148 19 打赏 收藏 转发到动态 举报
写回复
用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>类型变量不就行了,是这个意思吗,或者写个方法返回

110,571

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧