1

I have a generic interface like this:

public interface IHardwareProperty<T>{
bool Read();
bool Write();
}

Which is "passed through" an abstract base class:

public abstract class HardwareProperty<T>:IHardwareProperty<T>{
//Paritally implements IHardwareProperty (NOT SHOWN), and passes Read and Write through
//as abstract members.
    public abstract bool Read();
    public abstract bool Write();
}

and is completed in several inheriting classes that use different generic arguments

CompletePropertyA:IHardwareProperty<int>
{
    //Implements Read() & Write() here
}

CompletePropertyBL:IHardwareProperty<bool>
{
    //Implements Read() & Write() here
}

I'd Like to store a bunch of completed properties of different types in the same collection. Is there a way to do this without resorting to having a collection of objects?

4

3 回答 3

5

您需要使用所有这些都支持的类型。您可以通过使您的IHardwareProperty<T>界面非通用来做到这一点:

public interface IHardwareProperty
{
    bool Read();
    bool Write();
}

由于您的界面中没有任何方法使用T,因此这是非常合适的。使接口泛型的唯一原因是您在接口方法或属性中使用泛型类型。

请注意,如果实现细节需要或需要,您的基类仍然可以是通用的:

public abstract class HardwareProperty<T> : IHardwareProperty
{
   //...
于 2013-07-03T16:26:04.220 回答
0

不幸的是,没有,因为每个具有不同类型参数的泛型类型都被视为完全不同的类型。

typeof(List<int>) != typeof(List<long>)
于 2013-07-03T16:24:23.357 回答
0

为后代发布此内容:我的问题几乎与此相同,但稍作调整,我的界面确实使用了泛型类型。

我有多个实现通用接口的类。目标是拥有多个<Int/Bool/DateTime>Property类,每个类都包含一个字符串 ( _value) 和一个getValue()函数,该函数在调用时将字符串转换_value为不同的类型,具体取决于接口的实现。

public interface IProperty<T>
{
    string _value { get; set; }
    T getValue();
};

public class BooleanProperty : IProperty<bool>
{
    public string _value { get; set; }
    public bool getValue()
    {
        // Business logic for "yes" => true
        return false;
    }
}

public class DateTimeProperty : IProperty<DateTime>
{
    public string _value { get; set; }
    public DateTime getValue()
    {
        // Business logic for "Jan 1 1900" => a DateTime object
        return DateTime.Now;
    }
}

然后我希望能够将这些对象中的多个添加到一个容器中,然后调用getValue()每个容器,它会返回一个布尔值、日期时间或其他取决于其类型的对象。

我以为我可以做到以下几点:

List<IProperty> _myProperties = new List<IProperty>();

但这会产生错误:

Using the generic type 'IProperty<T>' requires 1 type arguments

但是我还不知道这个列表的类型是什么,所以我尝试添加一个类型<object>

List<IProperty<object>> _myProperties = new List<IProperty<object>>();

然后编译。然后我可以将项目添加到集合中,但我需要将它们投射到IProperty<object>丑陋的地方,而且老实说,我不确定这在幕后做了什么。

BooleanProperty boolProp = new BooleanProperty();
// boolProp.getValue() => returns a bool
DateTimeProperty dateTimeProp = new DateTimeProperty();
// dateTimeProp.getValue(); => returns a DateTime
_myProperties.Add((IProperty<object>)boolProp);
_myProperties.Add((IProperty<object>)dateTimeProp);
于 2018-12-21T20:16:50.550 回答