【问题标题】:Generic object creation method with default data具有默认数据的通用对象创建方法
【发布时间】:2018-05-09 17:42:57
【问题描述】:

我想在一个类中有两个简单的调用,这些调用会被其他类转换。比如:

ObjectCreator.CreateBlank<Human>();
ObjectCreator.CreatePopulated<Human>();
ObjectCreator.CreateBlank<Dog>();
ObjectCreator.CreatePopulated<Dog>();

我目前这样做:

public class ObjectCreator
{
    public static T CreateBlank<T>()
    {
        return Activator.CreateInstance<T>();
    }

    public static T CreatePopulated<T>()
    {
        //Somehow return new object with populated properties
    }
}

我正在与人口稠密的部分作斗争。我希望它返回具有已定义属性的该类型的“默认”对象。我已经尝试过一些涉及传递接口的事情,但它很快就会变得混乱(我也不认为这会特别干净)

因此,如果我调用 ObjectCreator.CreatePopulated(),我希望它以某种方式转到另一个类,在那里我创建一个新的任何东西,并将其属性填充为特定值。感觉就像我很接近但在这里错过了一块拼图。

我的最终目标是让调用尽可能简单/可读。 任何帮助表示赞赏。

我确实意识到简单地调用一个创建和填充每个对象的类可能会更容易,但这对我来说是一个学习练习,我想尝试让它尽可能通用.

【问题讨论】:

  • 你可以用反射来做到这一点。您动态地迭代每个对象属性,然后根据属性类型设置默认值。比如说,“123”代表字符串,1 代表数字(int/float/double/decimal),false 代表布尔值。
  • 首先想到的问题是:填充了什么?您将如何决定如何填充每个实例中的数据?您当前的方法不接受任何数据作为参数。
  • @Alejandro 填充了我定义的默认数据。所以 ObjectCreator.CreatePopulated() 会反弹到一个类,我实际上用我的数据返回一个 Human 的新实例。由于这个原因,当前的方法不接受任何参数。
  • @Blankdud 那么硬编码的解决方案就足够了。 ivanPfeff 下面的答案似乎已经足够了。

标签: c# oop generics


【解决方案1】:

我建议这样做:

public interface IPopulatable
{
    void Populate();
}

public class ObjectCreator
{
    public static T CreateBlank<T>() where T : new ()
    {
        return new T();
    }

    public static T CreatePopulated<T>() where T : IPopulatable, new()
    {
        var populatable = new T();
        populatable.Populate();
        return populatable;
    }
}

public class Human : IPopulatable
{
    public string Name { get; set; }

    public void Populate()
    {
        Name = "Joe";
    }
}

【讨论】:

  • 我相信你已经找到了我想要的东西。写得好,易于理解,谢谢!
猜你喜欢
  • 1970-01-01
  • 2022-01-07
  • 1970-01-01
  • 2019-10-31
  • 2016-02-25
  • 2015-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多