将对象状态序列化为常量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,这可能是一个有趣的项目)

将对象状态序列化为常量C#类

也许您可以将机制抽象为一个接口,比如:

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共享。。。。。