当前位置:  开发笔记 > 编程语言 > 正文

用作C#中泛型方法约束的泛型类?

如何解决《用作C#中泛型方法约束的泛型类?》经验,为你挑选了1个好方法。

我做错了什么或是不可能将泛型类指定为泛型方法的约束?

我一直在玩generics和db4o(开源对象数据库),我正在编写一个测试程序(见下面的代码)来存储和检索一些用户定义的泛型集合.

我正在尝试编写一个泛型方法(请参阅下面的GetCollectionFromDb)以从数据库中检索特定类型的集合.不幸的是,下面的代码返回了一行编译器生成的错误:

 MyCollection1 collection3 =
                  GetCollectionFromDb(Collection1Name);

错误消息是:

The type 'GenericsTest.MyCollection1'cannot be used as type parameter 'T'
in the generic type or method 'GenericsTest.Program.GetCollectionFromDb(string)'.
There is no implicit reference conversion from'GenericsTest.MyCollection1' to
'GenericsTest.MyCollectionBase'.

我将不胜感激任何关于我可能做错了什么的建议,或者我如何能够以不同的方式来达到所取得的成果.

using System;
using System.Collections;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using Db4objects.Db4o;

 namespace GenericsTest 
    {
        public class Entity1
        {
            public string SomeProperty { get; set; }
        }

        public class Entity2
        {
            public string SomeProperty { get; set; }
        }

        public abstract class MyCollectionBase : Collection
        {
            protected MyCollectionBase() : this("") { }

            protected MyCollectionBase(string pCollectionName) 
            {
                CollectionName = pCollectionName; 
            }

            public string CollectionName { get; set; }
        }

        public class MyCollection1 : MyCollectionBase
        {
            public MyCollection1(string pCollectionName) :
                                          base(pCollectionName) { }

            public void DoSomeWorkOnCollection1() {}
        }

        public class MyCollection2 : MyCollectionBase
        {
            public MyCollection2(string pCollectionName) :
                                          base(pCollectionName) { }

            public void DoSomeWorkOnCollection2() { }
        }

        public class Program
        {
            public static IObjectContainer db = null;

            public static void Main(string[] args)
            {
                const string Collection1Name = "Entity1Collection";
                const string Collection2Name = "Entity2Collection";
                db = Db4oFactory.OpenFile("Test.db");

                Entity1 entity1 = new Entity1();
                MyCollection1 collection1 = new MyCollection1(Collection1Name);
                collection1.Add(entity1);
                db.Store(collection1);

                Entity2 entity2 = new Entity2();
                MyCollection2 collection2 = new MyCollection2(Collection2Name);
                collection1.Add(entity1);
                db.Store(collection2);

                db.Commit();
                db.Close();
                db = Db4oFactory.OpenFile("Test.db");

                MyCollection1 collection3 = 
                       GetCollectionFromDb(Collection1Name);
            }

            private static T GetCollectionFromDb(string pCollectionName) 
                                                 where T : MyCollectionBase
            {
                IList queryResult = db.Query((T c) => 
                                         c.CollectionName == pCollectionName);
                if (queryResult.Count != 0) return queryResult[0];

                return null;
            }
        } 
    }

Jon Skeet.. 9

您的类型不满足约束.你提供了MyCollection1哪些来自MyCollection.但是,这并不意味着它来源于MyCollection.

也许你想表达对两个类型参数的约束而不是一个:

private static T GetCollectionFromDb(string pCollectionName) 
                                             where T : MyCollectionBase

然后用:

GetCollectionFromDb(Collection1Name);

如果不能解决问题,请告诉我们原因.



1> Jon Skeet..:

您的类型不满足约束.你提供了MyCollection1哪些来自MyCollection.但是,这并不意味着它来源于MyCollection.

也许你想表达对两个类型参数的约束而不是一个:

private static T GetCollectionFromDb(string pCollectionName) 
                                             where T : MyCollectionBase

然后用:

GetCollectionFromDb(Collection1Name);

如果不能解决问题,请告诉我们原因.


我认为,如果一些用户回答问题,你知道如何回答你之前他应该得到更多的代表:)
推荐阅读
小妖694_807
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有