C #, Преобразование строковой переменной в переменную класса - PullRequest
3 голосов
/ 31 августа 2011

У меня есть функция, как показано ниже.

public static object getClassInstance(string key, object constructorParameter)
{
         // body here
}

Переменная ключа будет иметь имя моего класса.Мне нужно вернуть новый экземпляр класса.Если constructorParm равен нулю, то мне нужно загрузить класс с конструктором по умолчанию, в противном случае передается параметр конструктора.Как мне это сделать ?

ADD:

Я написал код, подобный этому

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;
using Catalyst.BO.StudentProfileBO;
using Catalyst.BO.ReportBO;
using Catalyst.DAL.ReportDAO;
using System.Collections;
using System.Data;

namespace Catalyst.BO.Factory
{
    public class CFactory
    {
        public static object getClassInstance(string key, params  object[] constructorArgs)
        {
            string assemblyPath = null;
            string customClassName = key.Substring(0, 1) + "Custom" + key.Substring(1);

            DataSet objDataset = getAssemblyInfo(key);
            if (objDataset != null && objDataset.Tables.Count > 0 && objDataset.Tables[0].Rows.Count > 0)
            {
                assemblyPath = objDataset.Tables[0].Rows[0]["ACA_ASSEMBLY_PATH"].ToString();
            }

            Assembly assembly;
            Type type;

            if (assemblyPath != null && assemblyPath != string.Empty)
            {
                assembly = Assembly.LoadFile(assemblyPath);
                type = assembly.GetType(customClassName);
            }
            else // if no customisation
            {
                type = Type.GetType(key);
            }

            object classInstance = constructorArgs == null ? Activator.CreateInstance(type) : Activator.CreateInstance(type, constructorArgs);
            if (classInstance == null) throw new Exception("broke");
            return classInstance;
        }
    }
}

ключ, переданный в функцию - "CReportBO"CReportBO доступен в области действия функции.но в // если нет секции настройки (то есть type = Type.GetType (key)), type возвращает меня null.что не так?

Ответы [ 5 ]

7 голосов
/ 31 августа 2011

Если key либо с квалификацией сборки , либо с квалификацией пространства имен внутри основных сборок или вызывающей сборки, то:

Type type = Type.GetType(key);
return constructorParameter == null ? Activator.CreateInstance(type)
          : Activator.CreateInstance(type, constructorParameter);

Интересно, однако, если:

public static object getClassInstance(string key, params object[] args)

является более гибким, позволяя:

Type type = Type.GetType(key);
return Activator.CreateInstance(type, args);

с использованием, например:

object o = getClassInstance(key); // uses default constructor
object o = getClassInstance(key, null); // passes null to single parameter
object o = getClassInstance(key, 123, "abc"); // etc
1 голос
/ 31 августа 2011

Вы должны иметь возможность сделать что-то вроде этого:

Activator.CreateInstance(Type.GetType(keyBindings), constructorParameters)

Вы можете изменить подпись вашего метода на public static object getClassInstance(string key, params object[] constructorParameters), если хотите разрешить возможность использования нескольких аргументов конструктора.

0 голосов
/ 31 августа 2011

Сначала вы должны получить тип из вашей строки:

Type t = testAssembly.GetType(key);

Затем создайте экземпляр вашего типа:

Object o = Activator.CreateInstance(t, constructorParameter);

А o - это объект вашего типа

0 голосов
/ 31 августа 2011

Вы можете получить аналогичную функцию, используя метод C # Activator.CreateInstance.

Посмотрите на этот документ MSDN http://msdn.microsoft.com/en-us/library/dd384354.aspx

Вы можете сделать гораздо больше, используя класс Activator.

Приветствия, B

0 голосов
/ 31 августа 2011

Вам понадобится что-то похожее на это:

    public object CreateMyObject(string name, object constructorParam)
    {
        Type t = Type.GetType(name);
        if (t != null)
        {
            object o = Activator.CreateInstance(t, constructorParam != null ? new[] { constructorParam } : null);
            return o;
        }

        return null;
    }

Конечно, вам нужно будет добавить соответствующую обработку ошибок.

Черт, побитый Марком, его ответ имеет приоритетпо моему :)

...