.NET Type Conversion Issue: Simple but difficult
Well,
the question is kinda simple.
I have a object defined as:
public class FullListObject : System.Collections.ArrayList, IPagedCollection
And when开发者_如何转开发 i try to:
IPagedCollection pagedCollection = (IPagedCollection)value;
It don't work... value is a FullListObject... this is my new code trying to get around a issue with the "is" operator. When the system tests (value is IPagedCollection)
it never gets true for FullListObject.
How to cast the object to another object with a interface type?
EDIT:
Just for the record: the bugger code
if (value is IPagedCollection)
{
IPagedCollection pagedCollection = value as IPagedCollection;
The if was never hitting true, and forcing the conversion wasn't working too. So the issue was the double definition of classes. Now i defined the FullObjectList in a "Commom" project for classes used by the whole system. Problem gone!
You're doing it right. Try this (it will fail also but show the problem):
IPagedCollection pagedCollection = (FullListObject)value;
The compiler should accept this just fine. If not, you have multiple definitions of either IPagedCollection
and/or FullListObject
which conflict each other. If that fails at runtime, your value is not a FullListObject
.
Your code should work fine - I may not be understanding what you're trying to accomplish.
You don't need to cast value
in that assignment. Just doing
IPagedCollection pagedCollection = value;
will be sufficient - pagedCollection
will be declared as an IPagedCollection
, and contain a FullListObject
. The checks using the is
operator should return true. Doing the reverse as Lucero suggested will tell you whether you actually have a FullListObject
like you expect. Could you perhaps show us your code with the checks so we can see what your goal is?
Does FullListObject
explicitly implement IPagedCollection
? If so, then according to Msdn
A class that implements an interface can explicitly implement a member of that interface. When a member is explicitly implemented, it cannot be accessed through a class instance, but only through an instance of the interface.
To identify an explicit implementation, inspect interface member implementations. For example,
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
}
If this is indeed the case, then you have one of two options,
- Change
FullListObject
to implementIPagedCollection
implicitly, or - Cast your
FullListObject
to an instance ofIPagedCollection
as you have done
精彩评论