Невозможно выполнить приведение - PullRequest
0 голосов
/ 09 марта 2010

Мне нужен класс-обертка, который предоставляет некоторые свойства моего класса сущности с именем ProfileEntity.

Я пытался сделать это, производя от этой сущности, а затем создавая свойства, которые возвращают определенные свойства сущности, но он говорит, что я не могу привести от ProfileEntity к ProfileEntityWrapper.

Когда я пытаюсь поместить возвращаемые значения метода, который возвращает «ProfileEntity», в обертку, я получаю вышеуказанную ошибку.

Как мне создать такой класс-обертку, который будет кастуемым?

Пример

class ProfileEntityWrapper : ProfileEntity
{
    public string Name
    {
        get
        {
            return this.ProfileEntityName;
        }
    }
}

public class Someclass
{
  public ProfileEntity SomeMethod()
  {
     return ProfileEntity; // example of method returning this object
  }
}

public class SomeOtherlClass
{
   SomeClass sc = new SomeClass();

  public void DoSomething()
  {
    ProfileEntityWrapper ew = (ProfileEntityWrapper)sc.SomeMethod(); // Cannot do this cast!!!
  }
}

Ответы [ 4 ]

1 голос
/ 09 марта 2010

Нет, это невозможно.

Чтобы решить эту проблему, вы можете попробовать это:

public class ProfileEntity
{
    public string ProfileEntityName { get; set; }
}

public class ProfileEntityWrapper
{
    public ProfileEntityWrapper(ProfileEntity entity)
    {
        Entity = entity;
    }

    public ProfileEntity Entity { get; private set; }

    public string Name
    {
        get
        {
            return Entity.ProfileEntityName;
        }
    }
}

public class SomeClass
{
    public ProfileEntity SomeMethod()
    {
        // example of method returning this object
        ProfileEntity temp = new ProfileEntity();
        return temp;
    }
}

public class SomeOtherClass
{
    SomeClass sc = new SomeClass();

    public void DoSomething()
    {
        //Create a new Wrapper for an existing Entity
        ProfileEntityWrapper ew = new ProfileEntityWrapper(sc.SomeMethod());
    }
}
1 голос
/ 09 марта 2010

Вы не можете привести объект ProfileEntity к ProfileEntityWrapper.

var entity = new ProfileEntity(); // this object is only of type ProfileEntity
var wrapper = new ProfileEntityWrapper(); // this object can be used as both ProfileEntityWrapper and ProfileEntity

Возможно, вы хотите вернуть ProfileEntityWrapper в SomeMethod ():

public class Someclass
{
    public ProfileEntity SomeMethod()
    {
         return new ProfileEntityWrapper(); // it's legal to return a ProfileEntity
    }
}
0 голосов
/ 09 марта 2010

Это неправильный код с точки зрения полиморфизма. Если мы возьмем известный пример полиморфизма, когда есть базовые классы Shape и классы Circle, Polygon и Rectangle, которые расширяют класс Shape, ваш код попытается преобразовать некоторую форму в круг, и, как вы понимаете, это недопустимая операция приведения. Поэтому, чтобы этот код работал, вы должны быть уверены, что SomeClass.SomeMethod () вернет экземпляр ProfileEntityWrapper или выполнит проверку типа перед приведением типа, например:

ProfileEntity temp = sc.SomeMethod();
if(temp is ProfileEntityWrapper)
     ProfileEntityWrapper ew = (ProfileEntityWrapper) temp; 
0 голосов
/ 09 марта 2010

Если вам разрешено редактировать класс ProfileEntity или класс ProfileEntity является сгенерированным частичным классом, вы можете добавить интерфейс вместо использования оболочки. Вам не нужно было бы делать кастинг с интерфейсом. Пример:

public interface IProfile
{
    string Name { get; }
}

public partial class ProfileEntity : IProfile
{
    public string Name
    {
        get
        {
            return this.ProfileEntityName;
        }
    }
}

public class SomeClass
{
    public ProfileEntity SomeMethod()
    {
        return ProfileEntity;
    }
}

public class SomeOtherClass
{
    SomeClass sc = new SomeClass();

    public void DoSomething()
    {
        IProfile ew = sc.SomeMethod();
    }
}

Экземпляр IProfile будет предоставлять доступ только к свойству Name.

...