2010-02-06 5 views
2

Мне нужна помощь здесь, чтобы сделать динамическое создание экземпляра на C#. То, что я хочу выполнить, - это возможность использовать строковую переменную, которая используется как имя в экземпляре. Я думаю, вы можете использовать отражение или что-то в этом роде, но я потерял его. Вот мой фрагмент кода и, надеюсь, у кого-то есть ответ.C# Динамическое инстанцирование

Средние значения привязаны к классу, который обрабатывает все. Поэтому давайте скажем, что я хотел сделать тест переменной, и все, что связано с строкой теста, можно передать как экземпляр. Как я могу создать объект, который может обрабатывать ввод переменных, компилироваться и использоваться во время выполнения? Я знаю, что это может звучать необычно, но вместо меня я использую много IF с несколькими объявлениями о двухместных. Я мог бы использовать динамическое создание экземпляра. Любой, кто может помочь, я буду очень благодарен.

Averages test = new Averages(); 
double[] testresult; 
testresult = test.sma(); 

womp ,,, Я хочу динамически объявлять массивы двойников. Я уже знаю, как объявить статический массив. То, что я пытаюсь выполнить, - это исключить объявление 30 массивов, которые в основном делают одно и то же снова и снова с другим наименованием.

Так вместо того, чтобы сделать это:

   if (UITAName == "SMA") 
       { 
        Averages sma = new Averages(); 
        double[] smaresult; 
        smaresult = sma.sma(UITAName, YVal, UITPeriod, UITShift); 
        chart1.Series[UITA].Points.DataBindXY(test2, test1); 

       } 
       if (UITAName == "TMA") 
       { 
        Averages tma = new Averages(); 
        double[] tmaresult; 
        tmaresult = tma.tma(UITAName, YVal, UITPeriod); 
        chart1.Series[UITA].Points.DataBindXY(XVal, tmaresult); 
       } 

       else 
        if (UITAName == "EMA") 
        { 
         Averages ema = new Averages(); 
         double[] emaresult; 
         emaresult = ema.ema(UITAName, YVal, UITPeriod); 
         chart1.Series[UITA].Points.DataBindXY(XVal, emaresult); 
        } 

Я хочу сделать это только один раз за все, а не делать IF заявления. Проблема в том, что вы не можете скомпилировать с объявлением строки. Должен быть способ, которым я просто не знаю, как это сделать.

Средние значения UITAName = новые средние значения(); double [] UITANameresult; UITANameresult = UITAName.UITAName (UITAName, YVal, UITPeriod); chart1.Series [UITA] .Points.DataBindXY (XVal, UITANameresult);

+0

Ваш вопрос непонятен. Вы спрашиваете, как создать экземпляр класса с именем типа? Что вы имеете в виду «много IF с несколькими объявлениями удвоений»? – bobbymcr

+0

Я думаю, что я, возможно, смог собрать воедино вопрос OP ... ??? – IAbstract

+1

Звучит как шаблон фабричного метода (http://en.wikipedia.org/wiki/Factory_method_pattern) –

ответ

4

Вы можете создать экземпляр класса динамически, используя Reflection, с Activator.CreateInstance.

Activator.CreateInstance("MyAssembly", "MyType"); 

Однако я не совсем понимаю, что вы пытаетесь сделать. Если у вас уже есть класс под названием «Средние», что вам нужно динамически создать? И я немного обеспокоен тем, что вы имеете в виду, что это «привязано к классу, который обрабатывает все» ...

+2

Хммм ... позвольте мне задуматься над этим. +1 – kenny

+0

Я хочу динамически создать массив парных чисел. Допустим, у меня есть тест как декларация двойника. Теперь у меня есть база данных, которая имеет разные значения, которые я могу передать переменной «тест». Я хочу динамически создать экземпляр теста двойных чисел с любой входящей переменной. Возможно ли это? Спасибо за быстрый ответ. –

+0

Ничего себе, я думаю, что комментарий сделал это даже * меньше * ясно. – Aaronaught

2

Похоже, вам, возможно, потребуется зарегистрироваться Func<> ??? Просто моя первоначальная оценка, не видя немного больше кода, чтобы дать мне более четкий контекст.

Чтобы уточнить, если вы хотите передать значения в качестве аргумента, как в вашей командной строке, вам потребуется экземпляр сборки. В противном случае с помощью Func<T, TResult> вы можете динамически передавать параметры методу и получить возвращаемое значение.

... Хорошо, если я получаю то, что вы говорите ... вы хотите что-то, что будет напоминать:

class Average 
{ 
    public double[] sma() 
    { 
     // do something 
     return dArray; 
    } 

    public double[] ema() 
    { 
     // do something 
     return dArray; 
    } 
} 

, что это ... «имя» функция будет значение строки возвращается из какого-либо запроса на базу данных?

... и если это так, то я не знаю, почему вы не просто сделать словарь, как:

Dictionary<string, double[]> testResults = new Dictionary<string, double[]>(); 

void GetDoubles(string name, params double[] args) 
    { 
     testResult[s] = GetAverages(args); 
    } 
+0

Func отлично! – NotDan

0

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

public interface ICalculation 
{ 
    double [] Calculate(double y, double period, double shift); 
    double XVal {get;} 
} 

public class SMA : ICalculation 
{ 
    public override double[] Calculate(double y, double period, double shift) 
    { 
     // do calculation, setting xval along the way 
    } 

    // more code 
} 

public class EMA : ICalculation 
{ 
    public override double[] Calculate(double y, double period, double shift) 
    { 
     // do calculation, setting xval along the way 
    } 

    // more code 
} 

public class Averages 
{ 
    public void HandleCalculation(ICalculation calc, double y, double p, double s) 
    { 
     double[] result = calc.Calculate(y, p, s); 
     chart.Series[UITA].Points.DataBindXY(calc.XVal, result); 
    } 
} 
2

Я думаю, это могло бы помочь вам.

Если я вас правильно понимаю, у вас есть значения initinialization метод в дБ как SMA, EMA, и т.д., и вам нужно вызвать метод во время выполнения,

string invokeMethod = GetValueFromDB() //ur logic to get the SMA or EMA or TMA from db 
    Type urType=typeof("yourclassname"); 
    object unKnownObj = Activator.CreateInstance(urType); 

    //Fill your paramters to ur method(SMA,EMA) here 
    //ie, sma.sma(UITAName, YVal, UITPeriod, UITShift);   
    object[] paramValue = new object[4]; 
    paramValue[0] = UITAName; 
    paramValue[1] = YVal; 
    paramValue[2] = UITPeriod; 
    paramValue[3] = UITShift; 
    object result=null; 


     try 
     { 
      result = urType.InvokeMember(invokeMethod, System.Reflection.BindingFlags.InvokeMethod, null, unKnownObj, paramValue); 


     } 
     catch (Exception ex) 
     { 
      //Ex handler 
     } 

Так Таким образом, вы можете избежать мультипликатор, если петли и будет ссылаться на метод непосредственно по данному имени.

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