代码之家  ›  专栏  ›  技术社区  ›  Fabio Milheiro

有一种逆运算吗?

  •  2
  • Fabio Milheiro  · 技术社区  · 14 年前

    是否有typeof的逆运算?

    编辑

    我需要类才能使用通用存储库:

    GenericRepository<BaseEntity> repository = new GenericRepository<BaseEntity>(new AzureBrightData());
    

    我首先编写了BaseEntity,所有实体类都从中派生出来,但问题是存储库需要知道要搜索哪个表。

    7 回复  |  直到 14 年前
        1
  •  4
  •   Community CDub    8 年前

    我的回答将基于您在评论中提供的澄清:

    我误解了大家在这里说的话,至少我没有说清楚。我想得到我通常使用的课程。例如,我必须通过这样的课程: public void methodName<T>() T

    :不,不能,因为泛型类型是在编译时解析的。

    冗长的回答 :可以,但需要使用反射。下面是您如何做到这一点:

        2
  •  7
  •   cichy    14 年前

         Assembly asmApp = Assembly.LoadFile("some.dll");
         Type tApp = asmApp.GetType("Namespace.SomeClass");
         object oApp = Activator.CreateInstance(tApp, new object[0] { });
    
        3
  •  3
  •   Jerod Venema    14 年前

    使用“Activator”类:

    Activator.CreateInstance<T>
    
        4
  •  2
  •   Jim Brissom    14 年前
        5
  •  1
  •   sisve    14 年前

    使用new()约束。

    public T Create<T>() where T : new() {
        return new T();
    }
    
        6
  •  1
  •   Brian Gideon    14 年前

    以下是按我的喜好排列的几个选项。我是这么想的 T 泛型类或方法中的类型参数。

    new T(); // T must be constrained to support a default constructor.
    

    Activator.CreateInstance(typeof(T), new object[] { });
    

    typeof(T).GetConstructor(new Type[] { }).Invoke(null);
    

    AppDomain.CurrentDomain.CreateInstanceAndUnwrap(typeof(T).Assembly.FullName, typeof(T).FullName);
    
        7
  •  1
  •   Enigmativity    14 年前

    var repository = new GenericRepository<BaseEntity>(new AzureBrightData());
    

    你是想做更像这样的事吗?

    var repository = new GenericRepository<AzureBrightData>();
    

    如果是这样,则需要将泛型存储库类定义为:

    public class GenericRepository<T> where T : BaseEntity, new()
    {
        ...
    }
    

    然后你可以定义你的 BaseEntity 类,但存储库的实例化将为您提供所要查找的实际类(我希望是表)。