.NET类型转换问题:简单但困难

时间:2010-03-30 17:34:25

标签: .net types type-conversion casting

那么,

问题有点简单。

我有一个对象定义为:

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。问题消失了!

3 个答案:

答案 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
}

如果确实如此,那么你有两个选择之一,

  1. 更改FullListObject以隐式实施IPagedCollection
  2. 将您的FullListObject投射到IPagedCollection的实例