2013-09-21 3 views
2

Я хотел бы некоторые из моих методов принять Object и преобразовать его к годной к употреблению типа:динамически Преобразование типа объекта к типу (Часть класса)

* Простой пример

public void PostAction (object act){ 
    object Action = (act.GetType) act; 
    string ActionName = Action.PostName; 
} 

делать немного глядя вокруг интернета и Stackoverflow, я нашел только способы вызова методов объекта без типа

public void PostAction (object act){ 
    Type t = act.GetType(); // myObject.GetType() would also work 
    MethodInfo GetPostName = t.GetMethod("GetPostName"); 
    GetPostName.Invoke(act, null); 
} 

есть ли лучший способ? Можно ли применить объект к его типу?

ответ

6

Вы можете использовать dynamic:

public void PostAction (object act){ 
    ((dynamic)act).GetPostName(); 
} 

Но я бы пошел дальше и изменить подход:

  1. Declare интерфейс с GetPostName способом:

    public interface IMyInterface 
    { 
        void GetPostName(); 
    } 
    
  2. Реализовать интерфейса в вашем классе

  3. Изменить PostAction метод принять IMyInterface параметр:

    public void PostAction(IMyInterface act) 
    
  4. Используйте метод интерфейса жгутов PostAction метод:

    public void PostAction(IMyInterface act) 
    { 
        act.GetPostName(); 
    } 
    

Преимущества:

  • даст вам тип безопасности во время компиляции
  • будет быстрее, потому что не требует Reflection
+0

Спасибо за быстрый ответ, я попробую использовать интерфейс для некоторых из моего кода .... Я вижу только одну проблему: I есть один метод, который принимает объект, (срез) и заменяет его соответствующий срез в объекте (в целом) ..... Нужно ли его бросать? Или я могу вернуть сам объект в интерфейсе и бросить это? Или есть еще какой-нибудь другой способ сделать это :) – Burdock

+0

Вы можете указать тип возвращаемого метода как интерфейс. Собственно, это довольно распространенная практика. – MarcinJuraszek

+0

Не могли бы вы продемонстрировать это! Спасибо, парни! – Burdock

2

Вы не должны на самом деле никогда не использовать отражение для вызова метода объекта вы передаете в. И также не совсем лучшая практика использования объекта в качестве типа параметра метода. Вы обычно хотите, чтобы ваш код был строго типизирован.

В любом случае, если вы хотите «объект» в качестве типа вашего параметра, просто привести объект к интерфейсу или типу:

public interface IMyInterface 
    { 
     string GetPostName(); 
    } 

    public void PostAction(object actObject) 
    { 
     var action = actObject as IMyInterface; 
     if (action != null) 
     { 
      var postName = action.GetPostName(); 
     } 
    } 

Если вы приводите как это, результат может быть пустым, если объект не реализует этот интерфейс, поэтому вы можете проверить его на null ...

Смежные вопросы