2015-09-09 3 views
0

У меня есть метод, который может возвращать много типов объектов (поэтому он возвращает экземпляр объекта типа).Как я могу применить объект к исходному типу?

Как я могу применить его к оригинальному типу? (Речь идет о приведении к своему первоначальному типу, когда я не знаю, его типа во время выполнения Речь идет не о кастинг, когда я знаю, его типа,., Поэтому GetAnyObject метода черный ящик)

private void func() 
{ 
    var obj = GetAnyObject(); 
    callFunc(obj); 
} 
private void callFunc(object o) 
{ 
    var a = o.GetType(); 
    ... 
} 
+0

Является ли этот язык C#? Если это так, отметьте это как таковое. –

+0

Почему вы хотите использовать, когда вы не собираетесь использовать переменную casted во время компиляции. Просто используйте отражение объекта. – Euphoric

+0

Это действительно любой объект или может извлечь некоторые методы и использовать интерфейс? Ondrej Svejdar прав, вы должны использовать общее кодирование стиля C# (private void CallFunc (Object o) – Bjoern

ответ

1

Вы можете просто перейти к нему с помощью as, так как он вернет null, если сбой выполняется.

private void callFunc(object o) 
{ 
    var test = a as MyClass; 
    if (test != null) 
    { 
     // your logic 
    } 
} 

Если у вас есть список классов, которые вам нужно бросить на, проверить каждую из них в теле функции выше.

+0

Это неплохая идея, но потребуется модификация кода, если станет возможным какой-либо новый тип. – Kapol

+0

Слишком много типов классов ... – Dror

+0

@Dror Какова ваша конечная игра? Почему вы хотите «бросить» объект? – Candide

1

Если возможные типы имеют что-то общее, вы можете создать интерфейс, который реализует все эти типы, и придать результат этому типу интерфейса.

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

EDIT

Вы сказали, что вы используете сторонний код, который не будет изменен. Следовательно, все объекты, которые вы получаете , должны иметь что-то общее, чтобы сделать ваш код хотя бы немного общим. В противном случае у вас будет много if s для разных сценариев. Одной из вещей, которая приходит мне на ум, является получение объекта MemberInfo путем отражения и вызова его. Это предполагает, что все типы имеют определенный член. Я говорю о чем-то похоже на следующее:

MethodInfo someMethod = obj.GetType().GetMethod("M"); 
object result = someMethod.Invoke(obj); 

Это действительно трудно представить хорошее решение, не зная точные детали вашего затруднительного ;-)

+0

Проблема в том, что я получаю данные от другой службы, написанной кем-то еще, и он не изменит код для моих потребностей (для «приятного приложения») – Dror

+0

@Dror Я разместил редактирование. Взгляни, пожалуйста. – Kapol

+0

в предыдущем ответе, последний комментарий Я объяснил, что я хотел сделать. Данные, которые я получаю из 'GetAnyObject', представляют собой массив типа объекта, который является общим для данных. – Dror

0

Casting объекты на типы имеет смысл только во время компиляции , Как вы отреагируете на литой объект в своем коде?

Объект уже имеет его «оригинальный» тип. Дело в том, что когда вы угрожаете ему как object, вы не знаете его тип во время компиляции. Разумеется, во время выполнения он будет действовать так, как вы называете «оригинальный» тип.

Предположим, у вас есть класс, который переопределяет ToString() метод:

public class Foo 
{ 
    public override string ToString() { return "I am foo"; } 
} 

Тогда у вас есть кусок кода:

Foo foo = new Foo(); 
object obj = foo; 
// obj is of course Foo type 
Console.Write(obj.ToString()); 

Он будет результата курса в письменной форме «Я Foo» в консоль, потому что переменная obj имеет тип Foo, и она будет действовать правильно.

Тогда предположим, у нас есть класс:

public class Bar 
{ 
    public override string ToString() { return "I am bar"; } 

    public void Foobar() {} 
} 

И кусок не реальный код, который вы хотите иметь:

object obj = new Bar(); 

// your runtime type casting here: 
var casted = (obj.GetType()) obj; 

Вопрос: что вы будете делать с вашей casted переменной? Можете ли вы назвать метод Foobar()? Как вы узнаете, можете ли вы вызвать метод Foobar() во время компиляции, когда вы не знаете тип?

Возможно, вы ищете полиморфизм? Может быть, отражение? Может быть, динамические объекты?

EDIT: Из того, что вы говорите, вам нужно отражение, механизм для исследования типов во время выполнения. См. Это:

var type = obj.GetType(); 
var props = type.GetProperties(BindingFlags.Instance | BindingFlags.Public); 
foreach(var prop in props) 
{ 
    Console.WriteLine("property: {0} type:{1}", prop.Name, prop.PropertyType); 
} 
+0

Я не упоминал, но данные, которые я получаю от службы, написанной другим человеком, поэтому я не могу переопределить ее (все типы для приложения «приятно иметь»). Объект, который я получаю, представляет собой массив, и мне нужно изучить некоторые свойства каждого объекта в этом массиве. – Dror

+0

Тогда вам нужно отражение. См. Мое редактирование. –

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