簡體   English   中英

C#動態實例化

[英]C# Dynamic Instantiation

關於在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 = new Averages(); double [] UITANameresult; UITANameresult = UITAName.UITAName(UITAName,YVal,UITPeriod); chart1.Series [UITA] .Points.DataBindXY(XVal,UITANameresult);

您可以使用Reflection動態實例化一個類,使用Activator.CreateInstance

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

但是,我並不完全清楚你要做什么。 如果您已經有一個名為Averages的類,那么您需要動態實例化什么? 而且我有點擔心你的意思是“它與一個處理一切的課程聯系在一起”......

聽起來你可能需要查看Func <> ??? 只是我的初步評估,沒有看到更多的代碼,以給我一個更清晰的背景。

為了澄清,如果您希望將值作為參數傳遞,就像在命令行中那樣,那么您需要實例化程序集。 否則,使用Func<T, TResult>您可以將參數動態傳遞給方法並獲取返回值。

好的...如果我得到你說的話...你想要的東西類似於:

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

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

那就是...函數'name'是從某種數據庫查詢返回的字符串的值?

......如果是這種情況,那么我不知道為什么你不會像這樣做一本字典:

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

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

我想這可以幫到你。

如果我理解正確,你在db中有方法初始化值為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
        }

所以這樣你就可以避免多個if循環,並且會直接通過給定的名稱來調用方法。

我認為反思可能不是最適合您情況的解決方案。 也許稍微分解你的代碼可能會有所幫助,這有助於以下幾點......

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 );
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM