【问题标题】:Pass a generic parameter through constructor [duplicate]通过构造函数传递泛型参数[重复]
【发布时间】:2020-10-05 18:00:45
【问题描述】:

我有两个类,CompaniesContacts,我需要通过表单的构造函数传递其中一个类的实例。

    private Address _address;
    private Object _genericObject;

        public frmAddressAddModify(Address address = null, Object genericObject = null)
        {
            InitializeComponent();

            if (address != null)
            {
                _address = address; 
            }

            if (genericObject != null)
            {
                _genericObject = genericObject;
            }

        }

但是,我需要能够使用 genericObject 的属性和方法,这可能是公司或联系人,具体取决于我传递的内容。

顺便说一句,我正在使用的属性在公司和联系人中的同名(地址)下。

【问题讨论】:

  • 这看起来像是接口的经典用例。 docs.microsoft.com/en-us/dotnet/csharp/language-reference/…
  • 如果 Company 和 Contact - 是 genericObject 的子类,则将这些实例视为 genericObject 类。
  • frmAddressAddModify 本身的类型是什么?是Form 吗?否则,您可以将其本身设为泛型类型并获得所有好处。
  • 问题中没有generics...您在寻找基于泛型的解决方案吗?
  • 您在使用“通用”这个词时模棱两可。如果您的意思是“未知类型的对象”,那么您可以使用 CompanyContract 类型共有的公共基本类型作为参数类型。如果您实际上的意思是您想要一个泛型方法,那么您必须为该方法提供一个泛型类型参数,使该参数具有该类型,并将该类型(再次)约束为公共基类型。如果这两种类型不共享一个共同的基类型,那么您必须在方法中显式地强制转换。无论如何,重复的问题以及许多其他相同的问题显示了如何。

标签: c# .net object generics parameters


【解决方案1】:

多态性 101:

让两个类都实现一个接口,并将该接口的一个实例传递给您的类。

interface IHaveAddress // Please find a better name for this
{
    Address Address {get;}
}

class Companies : IHaveAddress
{
    public Address Address {get;} 
    // other staff goes here
}

class Contacts: IHaveAddress
{
    public Address Address {get;} 
    // other staff goes here
}

在表单的构造函数中:

public frmAddressAddModify(IHaveAddress haveAddress)
{
// code here...
}

【讨论】:

    【解决方案2】:

    您不能在 c# 中使用通用构造函数,我认为这就是您的目标。为什么这个对象可以是 Company 或 Contact ?他们之间有联系吗?也许他们都可以实现相同的接口。然后你注入了那个接口。这是一种解决方法。

    【讨论】:

    • 这并不完全准确 - 这是有效的 c#: class X<T> { public X(T value) => Value = value; public T Value {get;} }
    • 啊,你是对的。很酷的东西:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多