正在创建具有泛型属性的基Attribute类';值';

本文关键字:Attribute 创建 属性 泛型 | 更新日期: 2023-09-27 18:26:57

我所做的是在C#中创建一个"Attribute"基类。从那里我创建了其他类,这些类包含Attribute并根据需要添加任何其他属性。然而,当我试图创建包含所有这些不同属性的可观察集合时,我在这里得到了一个下划线

private ObservableCollection<Attribute> _attributes;

在"Attribute"下说:使用泛型类型"Attribute<TValue>'需要一个类型的参数。之所以使用Attribute基类,是因为我可以创建多个属性,如下所示。

属性类

using System.Collections.Generic;
namespace ExampleTool.Model
{
    public class Attribute<TValue>
    {
        public string Key { get; set; }
        public TValue Value { get; set; }
    }
    public class FloatAttr : Attribute<float>
    {
        public string Label { get; set; }
        private float minValue { get; set; }
        private float maxValue { get; set; }
    }
    public class IntAttr : Attribute<int>
    {
        public string Label { get; set; }
        private float minValue { get; set; }
        private float maxValue { get; set; }
    }
    public class StringAttr : Attribute<string>
    {
        public string Label { get; set; }
    }
    public class BoolAttr : Attribute<bool>
    {
        public string Label { get; set; }
    }
    public class ListStringAttr : List<string>
    {
        public string Label { get; set; }
    }
}

ViewModel-发生错误的位置。。。

using System.Collections.Generic;
using System.Collections.ObjectModel;
using ExampleTool.Model;
using ExampleTool.Helper;
namespace ExampleTool.ViewModel
{
    public class AttributeViewModel : ObservableObject
    {
        private ObservableCollection<Attribute> _attributes;
        public ObservableCollection<Attribute> Attributes
        {
            get { return _attributes; }
            set
            {
                _attributes = value;
                NotifyPropertyChanged("Attributes");
            }
        }
        public AttributeViewModel()
        {
            //hard coded data for testing
            Attributes = new ObservableCollection<Attribute>();
            FloatAttr floatAttr = new FloatAttr();
            Attributes.Add(floatAttr);
            IntAttr intAttr = new IntAttr();
            Attributes.Add(intAttr);
            StringAttr stringAttr = new StringAttr();
            Attributes.Add(stringAttr);
            BoolAttr boolAttr = new BoolAttr();
            Attributes.Add(boolAttr);
            ListStringAttr listStringAttr = new ListStringAttr();
            Attributes.Add(listStringAttr);
        }
    }
}

解决方案理念#1-只需从基类中删除value的属性,并在每个子类中定义它。

public class Attribute
    {
        public string Key { get; set; }
    }
    public class FloatAttr : Attribute
    {
        public float Value { get; set; }
        public string Label { get; set; }
        private float minValue { get; set; }
        private float maxValue { get; set; }
    }
    public class IntAttr : Attribute
    {
        public int Value { get; set; }
        public string Label { get; set; }
        private float minValue { get; set; }
        private float maxValue { get; set; }
    }
    public class StringAttr : Attribute
    {
        public string Value { get; set; }
        public string Label { get; set; }
    }
    public class BoolAttr : Attribute
    {
        public bool Value { get; set; }
        public string Label { get; set; }
    }
    public class ListStringAttr : Attribute
    {
        public List<string> Value { get; set; }
        public string Label { get; set; }
    }

正在创建具有泛型属性的基Attribute类';值';

您的基本Attribute类是一个泛型类型,那么您必须为其用法添加类型参数。但你不能只加t:

private ObservableCollection<Attribute<T>> _attributes;

因为T不是你的类型参数。您应该添加新的非通用基类:

public class AttributeBase
{
    public string Key { get; set; }
}
public class Attribute<TValue> : AttributeBase
{
    public TValue Value { get; set; }
}

并实现AttributeRetriever,类似于这个问题:

public Attribute<T> GetAttribute<T>() where T: DatabaseItem, new()
{
    return _attributes.OfType(typeof(Attribute<T>)).FirstOrDefault as Attribute<T>;
}

好消息是,您的WPF视图可以在没有类型参数的情况下正常工作,因为绑定使用反射。然后,若您不需要访问代码中的属性,也不需要实现检索器。