[英]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.