2012-10-16 2 views
0

특정 날짜의 주식 정보가 포함 된 일부 C# 코드로 매일 작성되는 SQL 데이터베이스가 있습니다.런타임에 클래스 만들기

분야 : StockCode, NumberOfHolders, 값, 날짜

새 레코드는 날짜 스탬프와 함께 데이터베이스에 추가가 매일.

다음 형식의 목록을 만들 수 있어야합니다.

  date1 date2 date3 
stock1 100  104  110 
stock2 105  100  99 
stock3 150  150  80 

그러나,이리스트는 것이다 필드는 각 주식의 시스템의 날짜 수에 따라 변화하는 것처럼, 동적해야 할 것 같다.

그래서 저는 다음과 같은 클래스를 사용할 수 없습니다.

private class Stocks: ExcelReport 
{ 
    public String StockCode { get; set; } 
    public Double TotalQtyHeld { get; set; } 
    public Double TotalValueOfStock { get; set; } 
    public DateTime Date { get; set; } 
} 

도움을 주시면 감사하겠습니다.

감사

+4

정말 그런 수업을 사용할 수 없습니까? 'List '을 만들려는 것 같습니다. 여기서 목록의 크기는 데이터베이스의 날짜 수입니다. – Sconibulus

+0

만약 당신을 올바르게 이해한다면, 목록이 필요합니다. 정확한 날짜가 기입 될 수 있습니다. – kabaros

답변

3

이 같은 날짜와 값을 보유 할 수있는 클래스를 만들 수 없습니다 :

private class StockValue 
{ 
    public Double TotalQtyHeld { get; set; } 
    public Double TotalValueOfStock { get; set; } 
    public DateTime Date { get; set; } 
} 

private class Stocks: ExcelReport 
{ 
    public String StockCode { get; set; } 
    public IList<StockValue> Values {get;set;} 
} 
+0

더 나은 접근을 위해 +1 –

+0

이렇게하면됩니다. 이거 고마워. –

1

내가 내 대답은 간단하다 그래서 만약 용서해주십시오 이해하고 있는지 확실하지 않습니다를 귀하의 요구 사항에. 값 목록이 필요하지 않습니까? 클래스 생성은 천재 솔루션처럼 들리지만 작업에는 너무 복잡합니다.

날짜/재고 정보 값 (또는 개체) 목록을 만듭니다. 당신은 유형으로 Tuple<Date, double>를 사용하거나 사용자 정의 클래스를 만들 수 있습니다

class DataValue 
{ 
    public DateTime Date { get; set; } 
    public double Value { get; set; } 
} 

그럼 그냥 키 - 값의 List<DataValue>

+0

DateTime 정보 목록만으로 수량 정보를 기록하는 방법은 무엇입니까? –

+0

좋은 질문입니다! 마법의 DateTime 클래스를 사용 하시겠습니까? 농담이야.그는 커스텀 클래스 나 튜플이 필요합니다. 발언 해줘서 고마워! – Mzn

0

목록을 사용/튜플은 당신이 2를 가지고 당신의 목적을 제공 할 수 있습니다 3 값, Jeffery 솔루션에 대한 자세한 정보가 필요한 경우.

private class Stocks : ExcelReport 
    { 
     public String StockCode { get; set; } 
     public List<Tuple<DateTime, Double, Double>> StocksValues { get; set; } 
    } 
0

이 옵션을 사용하는 것이 가장 좋은 방법은 아니지만 런타임에 자신의 클래스를 컴파일하여로드 할 수 있습니다. 다음은 텍스트를 DLL로 컴파일하는 방법의 예입니다.

 CSharpCodeProvider codeProvider = new CSharpCodeProvider(); 

     System.CodeDom.Compiler.CompilerParameters parameters = new CompilerParameters(); 
     parameters.GenerateExecutable = false; 
     parameters.GenerateInMemory = false; 
     parameters.WarningLevel = 3; 
     parameters.CompilerOptions = "/optimize"; 
     parameters.OutputAssembly = "C:\\test\\test.dll"; 
     parameters.ReferencedAssemblies.Add("Microsoft.CSharp.dll"); 
     parameters.ReferencedAssemblies.Add("System.dll"); 
     parameters.ReferencedAssemblies.Add("System.Core.dll"); 
     parameters.ReferencedAssemblies.Add("System.Data.dll"); 
     parameters.ReferencedAssemblies.Add("System.Data.DataSetExtensions.dll"); 
     parameters.ReferencedAssemblies.Add("System.XML.dll"); 
     parameters.ReferencedAssemblies.Add("System.XML.Linq.dll"); 

     CompilerResults results = codeProvider.CompileAssemblyFromSource(parameters, _BaseCode.ToArray()); 

     if (results.Errors.Count > 0) 
     { 
      LogError(results.Errors[0].ErrorText, "Error Compiling", null, "", ErrorLevel.Critical); 
      throw new Exception("Error Compiling.."); 
     } 

위의 코드는 코드를 컴파일하는 데 사용하는 더 큰 메소드의 일부입니다. 일부 변수는 존재하지 않습니다. 기본으로 사용하고 사용되는 메소드를 검색합니다. 코드를 컴파일 한 후에 DLL을로드하고 인스턴스를 생성 할 수 있습니다. 아래 코드는 몇 가지 샘플을 보여줍니다.

System.Reflection.Assembly _A = System.Reflection.Assembly.LoadFile(FileLocation); 

return (T)_A.CreateInstance(_ClassName, true, System.Reflection.BindingFlags.CreateInstance, null, Arguments.ToArray(), System.Globalization.CultureInfo.CurrentCulture, null); 
+0

반사는 확실한 해결책이지만, 여기에는 과도 할 수 있습니다. – sgud

+0

동의. 그냥 옵션을 제공 :) –

관련 문제