【问题标题】:More classes with same static functions with different functionality更多具有相同静态函数和不同功能的类
【发布时间】:2015-10-24 06:31:25
【问题描述】:

我有几个具有不同属性的类,我想对这些类的实例做同样的事情。可以说将它们的属性保存到带有其他信息的文本文件中(我没有该实例中的所有信息,因此我不能使用 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 类更好吗?

【问题讨论】:

  • 听起来像是序列化的工作。
  • 我在你的类中没有看到任何标记为static的东西,你从哪里得到这些静态信息?
  • @SteveFenton 这是某种序列化,但我必须将这些对象“序列化”到不同的程序,这些程序对传入数据有严格的规则,我无法通过 XML/二进制序列化来实现这些规则。
  • @RonBeyer 这些类中没有静态信息。我只是认为创建静态辅助类来处理这些类比每次我想保存/加载某些东西时创建辅助类的实例要好。

标签: c# generics static


【解决方案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
    }
}

【讨论】:

  • 不幸的是,我不能使用序列化 API,并且我同意使用这些工具进行编译测试不是解决我的问题的正确方法,所以我可能最终会得到一些 Interface 和辅助类实例,就像你一样建议。谢谢你提醒我Reflection ;-)
猜你喜欢
  • 1970-01-01
  • 2012-12-28
  • 2017-12-25
  • 2020-05-10
  • 2018-03-03
  • 1970-01-01
  • 2019-04-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多