3

这个样本:

public static void createDictionary<T>(IEnumerable<T> myRecords)
            where T: T.ID // Wont Compile
        {
            IDictionary<int, T> dicionario = myRecords.ToDictionary(r => r.ID);


            foreach (var item in dicionario)
            {
                Console.WriteLine("Key = {0}",item.Key);

                Type thisType = item.Value.GetType();

                StringBuilder sb = new StringBuilder();

                foreach (var itemField in thisType.GetProperties())
                {
                    sb.AppendLine(string.Format("{0} = {1}", itemField.Name, itemField.GetValue(item.Value, null)));
                }

                Console.WriteLine(sb);
            }

        }

如何强制作为参数传递的类型有一个名为“ID”的字段?

4

4 回答 4

9

您可以创建一个界面:

public interface IWithID
{
    // For your method the set(ter) isn't necessary
    // public int ID { get; set; } 
    public int ID { get; }
}

public static void createDictionary<T>(IEnumerable<T> myRecords)
        where T: IWithID

您需要以这种方式使用属性,而不是字段。

或者显然你可以使用基本类型......

public abstract class WithID
{
    // public int ID; // non readonly
    public readonly int ID; // can even be a field
}

public static void createDictionary<T>(IEnumerable<T> myRecords)
        where T: WithID

另一种解决方案是传递一个委托:

public static void createDictionary<T>(IEnumerable<T> myRecords, 
                                       Func<T, int> getID)

然后您使用GetID获取ID,例如myRecords.ToDictionary(getID)

于 2013-08-21T12:04:40.897 回答
5

从已定义的接口继承它。ID

public interface IIDInterface {
     int ID { get; set; }
}


public static void createDictionary<T>(IEnumerable<T> myRecords)
            where T: IIDInterface
于 2013-08-21T12:04:55.000 回答
0

where语法旨在指示该类基于某个其他类。所以你需要一个基类:

public abstract class IDBaseClass
{
    public int ID { get; set; }
}

然后将其更改为以下内容:

where T : IDBaseClass

然后,您在那里使用的类型只需要基于该类。现在,如果由于类型已经基于某些东西而无法构建抽象类,则可以使用接口:

public interface IIDInterface
{
    int ID { get; set; }
}

您可以将where语法更改为:

where T : IIDInterface

那么使用这个泛型类的类型只需要实现那个接口。

于 2013-08-21T12:05:32.890 回答
0

继承http://msdn.microsoft.com/en-us/library/ms173149.aspx

您需要一个“基类”或“接口”,它具有所有类都实现的属性 ID

where T : BaseClassWithID

或者

where T : IInterfaceWithID
于 2013-08-21T12:06:11.290 回答