将对象状态序列化为常量C#类
本文关键字:常量 序列化 对象 状态 | 更新日期: 2023-09-27 18:23:42
有几次,我发现自己想要获取对象的状态,并将其转化为常量。我正在设计一个用户界面,显示来自数据库调用的信息。我只想要一个数据样本,这样我就可以看到一切会是什么样子。
假设我有:
public interface IPerson
{
string Name{get;}
string Age {get;}
...
}
public class Person
{
string Name{get; set}
string Age {get; set}
...
}
以及一些方法,它确实说明了数据库调用,或者加载它的内容。对于这个例子,为了简单起见,它从CSV文件加载:对于这个例子,文件包含:"麦肯齐夫人,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}}
...
}
我能看到的唯一方法是序列化对象(prob到XML,这样我就可以看到其中的内容),然后让我的SamplePerson在其构造函数中取消序列化对象,以初始化它自己。现在,这是一个不错的解决方案。但我想如果我能"Serialize to C#"会更好。似乎可以在没有的情况下组合在一起,反思也有很多麻烦,所以我想知道是否有一些现有的图书馆。(如果没有,我想如果我得到bord,这可能是一个有趣的项目)
也许您可以将机制抽象为一个接口,比如:
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>();
}
据我所知,您希望将对象属性保存为硬编码值。为什么要这样做?
根据你的标记,我可以猜测你希望能够获得但不能设置值。如果是这种情况,您可以使用以下方法。
// 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; }
}
}
}
这种方法允许您隐藏实际实现,并限制对属性的访问,使其仅可读。
怎么样,使用CSharpCodeProvider编译您的类,然后实例化它并使用dynamics。。。。。
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);
}
*如何在运行时中编译C#代码片段
或者您可以在SamplePerson类中将IPerson作为dll共享。。。。。