Объект Dynami c не содержит определения свойства из ссылки - PullRequest
0 голосов
/ 29 апреля 2020

Ошибка, которую я получил:

«объект» не содержит определения для «теста»

enter image description here

Я также пытался game.test(), но я получаю эту ошибку

Это решение разделено на два отдельных проекта:

  • Первый - это .dll
  • Второй - консоль

, цель - динамически вызвать метод get из класса 'iw4mp'. Так что я мог бы позвонить любому из класса, пока он будет загружен. класс COD должен выглядеть бесполезным, но в будущем он будет смотреть, работает ли процесс на компьютере, но для моего теста я использую строку (но на самом деле она работает так же, как если бы он искал процесс).

Код из DLL

ХПК

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using CODOffsets.Interface;
using CODOffsets.Offsets;

namespace CODOffsets
{
    public class COD
    {
        static string[] games = { "iw4mp", "iw5mp", "bo1" };
        static Type CallofDuty;

        public static bool checkGame()
        {

            foreach (string game in games)
            {
                if (ProcessHandle(game))
                {
                    CallofDuty = Type.GetType("CODOffsets.Offsets" + "." + game);
                    return true;
                }
            }
            return false;
        }
        public static object Game()
        {
            return Activator.CreateInstance(CallofDuty) as ICODClass;
        }

        public static bool ProcessHandle(string game)
        {
            if (game == "iw4mp")
                return true;
            else
                return false;
        }

    }
}


Интерфейс

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace CODOffsets.Interface
{
    interface ICODClass
    {
        string test { get; }
    }
}

Смещение

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using CODOffsets.Interface;

namespace CODOffsets.Offsets
{
    class iw4mp : ICODClass
    {
        public string test { get { return "this is mw2"; } }
    }
}

Код из проекта консоли

Main

using System;
using System.Collections.Generic;
using System.Dynamic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using CODOffsets;

namespace TestGenericClass
{
    class Program
    {
        static void Main(string[] args)
        {
            if (COD.checkGame())
            {

                dynamic game = COD.Game();
                Console.WriteLine(game.test);
                Console.ReadKey();
            }
        }
    }
}

1 Ответ

1 голос
/ 29 апреля 2020

В основном это должно работать так, как вы. Но, если нет, вот несколько альтернатив.

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

var nameOfProperty = "test";
var propertyInfo = game.GetType().GetProperty(nameOfProperty);
var value = propertyInfo.GetValue(game, null);

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

string value = game["test"];
...