2012-02-08 21 views
0

有幾次,我發現自己想要獲取對象的狀態,並將其變爲常量。例如,我正在設計一個UI,顯示來自數據庫調用的信息。 我只是想要一個數據樣本來玩,所以我可以看到什麼樣的一切。序列化對象狀態爲常量C#類

讓說我有:

public interface IPerson 
{ 
    string Name{get;} 
    string Age {get;} 
    ... 
} 

public class Person 
{ 
    string Name{get; set} 
    string Age {get; set} 
    ... 

} 

和一些不說,數據庫調用,或什麼都加載它的方法。 對於這個例子可以說爲simpicities起見,加載它從一個CSV文件: 這個例子的文件包括:「夫人McKenzy,56,..」

IPerson Load(string fileName) 
{ 
    var text = File.ReadAllText(filename); 
    var parts = text.Split(","); 
    return new Person() 
    { 
     Name = parts[0], 
     Age = Int32.Parse(parts[1]), 
     ... 
    } 
} 

從這個我想我的生成類樣品(作爲一個cs文件)

public class SamplePerson : IPerson 
{ 
    string Name{get {return "Mrs McKenzy"}} 
    string Age {get {return 56}} 
    ... 
} 

我可以看到這樣做的唯一方法是連載的對象(概率爲XML,這樣我就可以看到它是什麼),然後有我SamplePerson deserialise的在其構造函數中創建對象,以便自己初始化。 現在這不是一個糟糕的解決方案。 但是我認爲如果我能夠「串行化爲C#」,它會更好。 似乎可以放在一起沒有與反射很多麻煩, 所以我想知道是否有一些現有的庫。 (如果不是我想這可能是一個有趣的項目要是我得到BORD)

+2

你所描述的代碼生成,不繫列化 – 2012-02-08 14:09:25

+0

它被標記代碼生成。 在這種情況下,它是一種序列化(至少在我看來) 我所做的大多數代碼生成都涉及到以一種語言獲取代碼並在另一種語言中生成代碼 - 例如特定於域的語言。 因爲這是關於持久對象狀態 – 2012-02-08 14:13:10

回答

0

或許你可以抽象機制的接口,是這樣的:

public interface IPersonRepository 
{ 
    IPerson GetPerson(int id); 
} 

,並提供設計時實現。

public class DesignTimePersonRepository : IPersonRepository 
{ 
    public IPerson GetPerson(int id) 
    { 
    return new DesignTimePerson { Name = "Joe Bloggs", Age = 56 }; 
    } 
} 

現在,假設你可以決定你是否是在設計模式,還是不行,你可以做這樣的事情:

public IPersonRepository GetPersonRepository() 
{ 
    return DesignMode 
    ? new DesignTimePersonRepository() 
    : _container.Resolve<IPersonRepository>(); 
} 
+0

我已經擁有那種系統就地。 我想擺脫手工作品: new DesignTimePerson {Name =「Joe Bloggs」,Age = 56}; (在我的真實代碼中,它實際上有很多字段(例如,它的樹狀結構,但我爲此示例進行了大規模簡化)) – 2012-02-08 14:45:35

0

據我瞭解,你要保存的對象屬性硬編碼值。 爲什麼要這樣做?

根據您的標記,我可以猜想你希望能夠得到但不設置的價值。 如果出現這種情況,您可以使用以下方法。

// make a public interface 
public interface IPerson { 
    String Name { get; } 
    String Age { get; } 
} 

public class Manager { 
    public IEnumerable<IPerson> GetPeople() { 
     var retVal = new List<Person>(); 
     // Do your retrieval. Here you can access 
     // the setters of your class. 
     return retVal; 
    } 
    // make a private implementation 
    private class Person : IPerson { 
     public String Name { get; set; } 
     public String Age { get; set; } 

     // explicit interface implementation 
     String IPerson.Name { 
      get { return Name; } 
     } 

     String IPerson.Age { 
      get { return Age; } 
     } 
    } 
} 

該方法允許您隱藏實際實現並限制對屬性的訪問,使其只能讀取。

+0

沒有sorr,我清楚地知道我已經弄清楚了。 我想取對象的當前狀態。並生成包含另一個類(共享接口)的.cs文件,該文件包含所有字段(理想情況下爲complile time)常量。 – 2012-02-08 14:42:31

+0

@Oxinabox然後,我只能建議你成爲谷歌的好朋友,使用'動態,類,.net,反射,發射',深入操作代碼的不同組合,並做你自己的類生成器,將滿足您的特定需求。祝你好運)) – Oybek 2012-02-08 14:48:58

+0

可能是一個有趣的下午。似乎有人會這樣做。 (我可能會對codeplex進行挖掘) – 2012-02-08 14:52:58

0

這個怎麼樣,使用CSharpCodeProvider,編譯你的類,比如,它和使用動態.....

void Main() 
{ 
    dynamic instanceOfMyType; 

    using (CSharpCodeProvider csharpCodeProvider = new CSharpCodeProvider()) 
    { 

     var outPutFile = Path.ChangeExtension(Path.GetTempFileName(), ".dll"); 
     CompilerParameters parameters = new CompilerParameters() 
     { 
      //For creating DLLs it should be false 
      GenerateExecutable = false, 
      OutputAssembly = outPutFile, 
      //For displaying warnings in the compilerResults 
      WarningLevel = 4, 

     }; 
     //I am reading the text from a WPF RichTextbox 
     var text = File.ReadAllText(@"c:\temp\SampleFoo.cs"); 
     CompilerResults compilerResults = csharpCodeProvider.CompileAssemblyFromSource(parameters, text); 

     var type = compilerResults.CompiledAssembly.GetType("SampleFoo"); 
     instanceOfMyType = Activator.CreateInstance(type); 
    } 
    Console.WriteLine (instanceOfMyType.Bar); 
} 

* How to compile C# code snippet in runtime


,或者您可以共享IPerson爲SamplePerson類的DLL

........