Создать динамический объект из заданной ссылки на класс и добавить в него значения из списка

Мне нужно определить метод CreateClassInstance(), который принимает ссылку на класс в качестве параметра. На основании заданной ссылки на класс создает динамический экземпляр класса и во время выполнения присваивает значения из списка. для тестирования я определил класс TempUser, и в действительности это может быть любой класс. Моя цель - дать ссылку на класс и файл Excel, и он возвращает объект карты с данными Excel.

Я написал Activator.CreateInstance, который создает экземпляр класса, но я изо всех сил пытался добавить значения в созданный объект экземпляра.

TestClass

public class TempUser
{
    public string CollarID { get; set; }
    public string Email { get; set; }
    public string IMEI { get; set; }
    public string Forename { get; set; }
    public string Surname { get; set; }
}

public void processRequest()
{
  CreateClassInstance<TempUser>()
}

..

public void CreateClassInstance<T>()
{
  Type ReceiveClasstype = typeof(T);
  T newObject = (T)Activator.CreateInstance(typeof(T));

   //need help here to create object and add values to it.
    ?????????????????
}

Это эквивалентно, я хочу под вышеупомянутым методом CreateClassInstance

List<TempUser> TempUserListObject = new List<TempUser>();
List<string> TempObjectDataList = new List<string>();

for (int i = ReadExcelRowFrom; i <= rowCount; i++)
{
    for (int j = 1; j <= colCount; j++)
    {
        if (j == 1)
        {
            Console.Write("\r\n");
        }

        if (xlRange.Cells[i, j] != null && xlRange.Cells[i, j].Value2 != null)
        {
            TempObjectDataList.Add(xlRange.Cells[i, j].Value2.ToString());



            Console.Write(xlRange.Cells[i, j].Value2.ToString() + "\t");
        }
        else
        {
            TempObjectDataList.Add("");
        }

    }

    TempUserListObject.Add(new TempUser()
    {
        CollarID = TempObjectDataList[0],
        Email = TempObjectDataList[1],
        IMEI = TempObjectDataList[2],
        Forename = TempObjectDataList[3],
        Surname = TempObjectDataList[4],
        Station = TempObjectDataList[5],
        Rank = TempObjectDataList[6],
        Department = TempObjectDataList[7],
        Division = TempObjectDataList[8],
        Area = TempObjectDataList[9],
        SupCollarID = TempObjectDataList[10],
        AccessRights = TempObjectDataList[11]
     });
    TempObjectDataList.Clear();
}

1 ответ

Решение

Вы могли бы позвонить GetProperty метод типа, чтобы получить PropertyInfo а затем позвоните SetValue метод этого, чтобы установить свойство определенного экземпляра, например:

public void CreateClassInstance<T>()
{
    Type ReceiveClasstype = typeof(T);
    T newObject = (T)Activator.CreateInstance(typeof(T));

    //set the CollarId property of newObject:
    var property = ReceiveClasstype.GetProperty("CollarID ");
    property.SetValue(newObject, "collar id value...");
}

Конечно, вам нужно знать имя свойства, которое вы хотите установить.

Вы могли бы получить PropertyInfo всех открытых свойств типа с использованием GetProperties метод:

PropertyInfo[] propertInfos = ReceiveClasstype.GetProperties();
Другие вопросы по тегам