Нахождение Конкретного Типа позади Интерфейсного экземпляра

44
задан 21 July 2009 в 15:21
поделиться

5 ответов

Type objectType = myObject.GetType();

Все равно должно дать вам конкретный тип, по вашему примеру.

76
ответ дан 26 November 2019 в 22:01
поделиться

То, что вы делаете, на самом деле является дизайном кровати, но вам не нужно использовать отражение, вы можете проверить это так

void PerformAction(object myObject)
{
    B objectType = myObject as B;   // Here is where I get typeof(IA)
    if ( objectType != null )
    {
        //use objectType.b
    }
    else
    {
       //Same with A 
    }
    // snip - other actions on objectType
}
5
ответ дан 26 November 2019 в 22:01
поделиться

У вас никогда не может быть экземпляров интерфейса. Поэтому определить, имеете ли вы дело с интерфейсом или конкретным типом, невозможно, поскольку вы всегда будете иметь дело с конкретным типом. Так что я не уверен, что ваш вопрос имеет смысл. Что именно вы пытаетесь сделать и почему?

3
ответ дан 26 November 2019 в 22:01
поделиться

Не могу не согласиться насчет плохого дизайна. Если у вас есть интерфейс, это должно быть связано с тем, что вам нужно использовать некоторые общие функции, не заботясь о конкретной реализации. Учитывая ваш пример, похоже, что метод PerformAction действительно должен быть частью интерфейса:

public interface IA
{
    int a { get; set; }
    void PerformAction();
}

public class B: IA
{
    public int a { get; set; }
    public int b { get; set; }

    public void PerformAction()
    {
        // perform action specific to B
    }
}

public class C : IA
{
    public int a { get; set; }
    public int c { get; set; }

    public void PerformAction()
    {
        // perform action specific to C
    }
}

void PerformActionOn(IA instance)
{
    if (instance == null) throw new ArgumentNullException("instance");

    instance.PerformAction();

    // Do some other common work...
}


B b = new B();
C c = new C();

PerformActionOn(b);
PerformActionOn(c);
5
ответ дан 26 November 2019 в 22:01
поделиться

Может быть, вы ищете оператор

void PerformAction(object myObject)
{
    if (myObject is B)
    {
        B myBObject = myObject as B;
        myBObject.b = 1;
    }

    if (myObject is C)
    {
        C myCObject = myObject as C;
        myCObject.c = 1;
    }

    // snip - other actions on objectType
}
1
ответ дан 26 November 2019 в 22:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: