如何创建List <item <t>&gt;

时间:2015-12-01 19:55:32

标签: c# generics

试着绕过这一个。请考虑以下代码。

public class Setting<T> where T: struct
{
    public string  Name { get; set; }
    public T Value { get; set; }
}

public class SettingsDto
{
    public List<Setting<>> Settings{ get; set; }
}

问题出在SettingsDto类中。我的设置属性要我指定List&gt;的类型。我现在所知道的是T必须是一个结构。如何创建一个设置列表,以便我以后可以在运行时添加它。有办法解决这个问题吗?

非常感谢所有回复。

4 个答案:

答案 0 :(得分:3)

您可以将通用参数转移到SettingsDto

public class SettingsDto<T> where T : struct
{
    public List<Setting<T>> Settings { get; set; }
}

答案 1 :(得分:2)

您必须将T泛型类型传递给SettingsDto。

试试这个:

TouchListener

答案 2 :(得分:1)

只有在所有设置都有共同点的情况下才能执行此操作。考虑使用这样的界面:

public interface ISetting
{
    string Name { get; set; }
}
public class Setting<T> : ISetting
    where T : struct
{
    public string Name { get; set; }
    public T Value { get; set; }
}

public class SettingsDto
{
    public List<ISetting> Settings { get; set; }
}

class Program
{
    static void Main(string[] args)
    {
        var set=new SettingsDto();
        set.Settings=new List<ISetting>();
        set.Settings.Add(new Setting<int>() { Name="Setting1", Value=100 });
        set.Settings.Add(new Setting<double>() { Name="Setting2", Value=Math.PI });
        set.Settings.Add(new Setting<DateTime>() { Name="Setting3", Value=DateTime.Now });
        set.Settings.Add(new Setting<int>() { Name="Setting4", Value=200 });

        foreach(var setting in set.Settings.OfType<Setting<int>>())
        {
            Console.WriteLine("{0}={1}", setting.Name, setting.Value);
        }
        // Setting1=100
        // Setting4=200
    }
}

答案 3 :(得分:0)

它必须是结构吗?否则你可以使用

public List<Setting<object>> Settings { get; set; }

并在需要时施放它。

如果不是出于性能原因,可以将结构放在类中。