那么,
问题有点简单。我有一个对象定义为:
public class FullListObject : System.Collections.ArrayList, IPagedCollection
当我尝试:
IPagedCollection pagedCollection = (IPagedCollection)value;
它不起作用... value是一个FullListObject ...这是我的新代码试图解决“is”运算符的问题。当系统测试(value is IPagedCollection)
时,FullListObject永远不会成为现实。
如何将对象转换为具有接口类型的另一个对象?
编辑:
仅供记录:错误代码
if (value is IPagedCollection)
{
IPagedCollection pagedCollection = value as IPagedCollection;
if永远不会真实,强迫转换也不行。所以问题是类的双重定义。现在我在“Commom”项目中为整个系统使用的类定义了FullObjectList。问题消失了!
答案 0 :(得分:6)
你做得对。试试这个(它也会失败,但显示问题):
IPagedCollection pagedCollection = (FullListObject)value;
编译器应该接受这个就好了。如果没有,则您有IPagedCollection
和/或FullListObject
的多个定义相互冲突。如果在运行时失败,则您的值不是FullListObject
。
答案 1 :(得分:0)
您的代码应该可以正常工作 - 我可能无法理解您要完成的任务。
您无需在该作业中投射value
。刚做
IPagedCollection pagedCollection = value;
就足够了 - pagedCollection
将被声明为IPagedCollection
,并且包含FullListObject
。使用is
运算符的检查应返回true。像Lucero建议的那样反过来会告诉你实际上是否真的有FullListObject
。您是否可以通过支票向我们展示您的代码,以便我们了解您的目标是什么?
答案 2 :(得分:0)
FullListObject
明确实施IPagedCollection
吗?如果是,那么根据Msdn
实现接口的类可以显式实现该接口的成员。当一个成员被显式实现时,它不能通过类实例访问,而只能通过接口的实例访问。
要识别显式实现,请检查接口成员实现。例如,
public interface IService
{
void Start ();
void Stop ();
}
public class Service : IService
{
#region IService Members
// note interface-dot-membername signature. explicit
// implementations *explicitly* declare the interface
// they are members of. this allows an implementation
// to contain members of the same name but of different
// interface declarations
void IService.Start () { }
void IService.Stop () { }
#endregion
}
如果确实如此,那么你有两个选择之一,
FullListObject
以隐式实施IPagedCollection
或FullListObject
投射到IPagedCollection
的实例