c # отражение с динамическим классом - PullRequest
0 голосов
/ 13 ноября 2009

Мне нужно выполнить метод «FindAll» на моей странице. Этот метод возвращает список объекта.

Это мой метод, который я выполняю "FindAll". FindAll требует int и возвращает список этих классов.

public void ObjectSource(int inicio, object o)
{
  Type tipo = o.GetType();
  object MyObj = Activator.CreateInstance(tipo);
  object[] args = new object[1];
  args[0] = inicio;
  List<object> list = new List<object>();
  object method = tipo.InvokeMember("FindAll", BindingFlags.Default | BindingFlags.InvokeMethod, null, null, args);
}

Когда я запускаю ObjectSource, он возвращается нормально, но я не могу получить доступ к результату. В VS2008 я могу визуализировать список с помощью «Ctrl + Alt + q», но приведение не работает.

Я забыл сказать: этот метод "FindAll" является статическим!

Ответы [ 3 ]

1 голос
/ 13 ноября 2009

Попробуйте (обновлено):

public IEnumerable ObjectSource(int inicio, object o) {
    Type type = o.GetType();
    object[] args = new object[] { inicio };
    object result = type.InvokeMember("FindAll", 
        BindingFlags.Default | BindingFlags.InvokeMethod, null, o, args);
    return (IEnumerable) result;
}

Лучшим решением было бы поместить ваш FindAll метод в интерфейс, скажем, IFindable, и заставить все ваши классы реализовать этот интерфейс. Затем вы можете просто привести объект к IFindable и вызвать FindAll напрямую - отражение не требуется.

1 голос
/ 13 ноября 2009

Мало что здесь происходит, во-первых, ваш метод не возвращает результат.

Во-вторых, когда вы возвращаете объект, ничто не мешает вам приводить к соответствующему типу в вызывающем коде.

В-третьих, вы можете использовать Generics для строгой типизации этого метода:

public T ObjectSource<T>(int inicio, T o)
{
  Type tipo = typeof(T);
  object MyObj = Activator.CreateInstance(tipo);
  object[] args = new object[1];
  args[0] = inicio;
  return tipo.InvokeMember("FindAll", BindingFlags.Default | BindingFlags.InvokeMethod, null, null, args) as T; 
}
0 голосов
/ 17 ноября 2009

Даниэль, у меня есть несколько объектов, которые мне нужны, чтобы связать представление сетки, и этот список содержит более 1000 записей, затем нужно разбить на 50 страниц, и этот источник объекта должен быть универсальным, потому что вызовет FindAll для классов!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...