2015-10-23 49 views
0

我有几个具有不同属性的类,我想用这些类的实例做同样的事情。让我们说保存他们的属性文本文件与其他信息(我没有在该实例中的所有信息,所以我不能使用像ToString()方法的东西 - 我必须在另一个类的这些属性)。
这里是例如两类:更多具有不同功能的静态函数的类

class Dog 
{ 
    public int Height { get; set; } 
    public string Name { get; set; } 
} 

class Car 
{ 
    public bool IsConvertible { get; set; } 
    public string VIN { get; set; } 
} 

在文本文件,我想有像保存实例:

20151023;狗; 32厘米;我的狗;
20151023;汽车;真正; WP0ZZZ99ZTS392124;

我认为对于每个支持的类使用方法public static void Write(T)public static T Read(string line)都有特殊的静态类会很好。这两种方法在每个班级中都有相同的名称,但功能略有不同,所以我认为InterfaceAbstract class可以工作,但都不适用于static方法。

  1. 有什么方法可以肯定那些静态方法是在所有类中实现的吗?
  2. 在这种情况下使用“经典”类而不是static是更好吗?
+0

听起来像是一个序列化工作。 – Fenton

+0

我没有看到标记为'static'的类中的任何内容,您从哪里获取此静态信息? –

+0

@SteveFenton它是某种序列化,但我必须将这些对象“序列化”为不同的程序,该程序对传入数据有严格的规则,并且我无法通过XML /二进制序列化实现该规则。 – Artholl

回答

1

我假设你正在寻找一种方法,允许你定义一些可以为不同的类实现的抽象。而且,将对象内容保存到某个字符串中仅仅是一个例子。如果情况并非如此(即您只关心序列化),那么只需使用.NET框架中的序列化API即可。

有什么方法可以肯定那些静态方法在所有类中实现?

你不能用C#单独做到这一点。您可以使用一些钩入编译过程的工具,并允许您为您的类设置自定义规则。尽管如此,我不建议你这样做。

在这种情况下使用“经典”类而不是静态类更好吗?

是的。我建议你创建一个通用接口。

我将使用您所提供的相同的例子(将内容保存或序列号):

public interface ISerializer<T> 
{ 
    string Read(T obj); 
    void Write(T obj, string data); 
} 

然后你就可以创建对象序列化。下面是Dog对象的例子:

public class DogSerializer : ISerializer<Dog> 
{ 
    public void Write(Dog obj, string data) 
    { 
     //Parse the data string and set properties on the object 
    } 

    public string Read(Dog obj) 
    { 
     //Create a string by reading properties from the dog object 
    } 
} 

你也可以创建一个使用Reflection从/到任何对象的读/写性能的通用串行。

public class Serializer<T> : ISerializer<T> 
{ 
    public string Read(T obj) 
    { 
     //Use reflection here to read object properties 
    } 

    public void Write(T obj, string data) 
    { 
     //Use reflection here to set object properties 
    } 
} 
+0

不幸的是我不能使用序列化API,我同意使用这些工具进行编译测试对于我的问题不是正确的,所以我可能最终得到一些'Interface'和Helper类实例,正如你所暗示的。并感谢你让我想起'反射';-) – Artholl

相关问题