【问题标题】:Is there a typeof inverse operation?有没有一种逆运算?
【发布时间】:2021-08-07 06:26:27
【问题描述】:

我得到了类型,但这与我正在寻找的类不同。

typeof有逆运算吗?

编辑

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

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

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

例如,如果我们有一个分区键和行键组合对 (1,1),这不允许我或存储库知道从哪个表获取注册表。这还不够,这就是为什么我认为我需要这张桌子。

【问题讨论】:

  • 你想在课堂上做什么?实例化一个对象?调用静态方法?
  • 您能说得更具体些吗? Type 是类型的定义,可以是类(引用类型)或结构(值类型)。 Type 实例通常从 typeof(T) 或 obj.GetType() 中检索。
  • 添加“typeof(Type) 的对面”用于搜索目的。
  • "Converse of typeof" 用于搜索目的。
  • 如果您的意思是将来帮助搜索者,那么也许您的意思是“typeof的逆运算”?感谢您的输入。帮助其他人找到满足他们需求的答案总是好的。

标签: c# reflection


【解决方案1】:

如果我在你的问题下没有理解答案,那么你可能正在寻找这样的东西(实例化类型):

程序集 asmApp = Assembly.LoadFile("some.dll"); 类型 tApp = asmApp.GetType("Namespace.SomeClass"); object oApp = Activator.CreateInstance(tApp, new object[0] { });

【讨论】:

  • 唯一正确答案,未投票。我最好解决这个问题:)
  • 我误解了这里大家所说的或者至少我没有说清楚。我想像正常使用一样上课。例如,我必须像这样传递类: public void methodName() 其中 T 是类。这样,我就可以按照新编辑中提到的那样使用它。还是非常感谢。你仍然乐于助人,因此得到了支持。
【解决方案2】:

我将根据您在评论中提供的说明来回答:

我误解了这里的每个人都在说什么,或者至少我没有说清楚。我想像正常使用一样上课。例如,我必须像这样传递类:public void methodName&lt;T&gt;() 其中T 是类。

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

长答案:可以,但需要使用反射。这样做的方法如下:

【讨论】:

  • 虽然这不是我最初想要的,但它非常有帮助,因此决定将其标记为答案。谢谢海因齐!
  • @Fabio:谢谢。我必须承认,我并不完全理解您对您的问题提供的最后一次编辑。对此提出一个额外的问题可能是有意义的(即,关于如何做存储库的事情)。如果您的库设计要求您使用反射,则可以改进设计以消除对反射的需求。
  • 我不得不使用反射,这样我们的工人角色更新方法才能满足我们未来需要的任何事情。存储库本身就是另一个主题。我没有创建它,也不会更改它。再次感谢您的光临。
【解决方案3】:

使用“激活器”类:

Activator.CreateInstance<T>

【讨论】:

    【解决方案4】:

    我想你正在寻找Activator.CreateInstance

    【讨论】:

      【解决方案5】:

      以下是按我的偏好顺序列出的一些选项。我假设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);
      

      【讨论】:

        【解决方案6】:

        使用 new() 约束。

        public T Create<T>() where T : new() {
            return new T();
        }
        

        【讨论】:

        • 或者直接使用内置的Activator.CreateInstance
        【解决方案7】:

        我一定错过了什么。到目前为止提供的答案似乎与问题不符。我希望更清晰。

        不过我会尽量回答我看到的问题。

        你说你正在尝试这样做:

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

        您是否正在尝试做更多类似的事情?

        var repository = new GenericRepository<AzureBrightData>();
        

        如果是这样,那么您的通用存储库类需要这样定义:

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

        然后您可以像以前一样定义您的 BaseEntity 类,但是您的存储库的实例化将为您提供您正在寻找的实际类 - 我希望然后是表。

        希望我能理解你的问题。

        【讨论】:

        • 我想将变量类型转换为类本身。它与“new AzureBrightData()”部分无关......但是当你说没有人回答这个问题时你是对的:) 我用另一种方式解决了这个问题。谢谢!
        • typeof(token)的反面就是token。令牌是标识类的文字。给定一个 Type 对象的实例,反之则是作为类标识符的文字。我想这就是他想要的。你可以在哪里使用这个?字面量是您进行强制转换或“as”右侧所需要的。
        【解决方案8】:

        我不完全理解 OP 问题,但我认为这肯定会帮助一些搜索 inverse of typeof 的人,这就是我自己到达这里的方式。

        我在查找表中有一个动态组件列表。

        class ImageComponent
        {
            media: 'IMAGE';
        }
          
        class VideoComponent
        {
            media: 'VIDEO';
        }
        
        // lookup table (runtime construct)    
        const components = {
        
            'image': ImageComponent,
            'video': VideoComponent
        }
        

        所以我想取'image'(表中的键)并以IMAGE 结尾,这是ImageComponent 的属性。

        从表格中查找组件:

        type imageComponent = typeof components['image'];    // typeof ImageComponent
           
        

        如果我们确实有ImageComponent,那么我们可以对其进行类型查找。

        ImageComponent['media']       // 'IMAGE'
        

        但是我们有 typeof ImageComponent 代替,它对于查找类上的任何属性是无用的。

         type mediaType = imageComponent['media'];                // does not work
        

        实际答案...

        所以我们可以做的是从 `typeof YourClassName' 中获取“原型类型”。

          type media = imageComponent['prototype']['media'];      // 'IMAGE'  (const value)
        

        或者换句话说,我们实际上在做的是:

          type media = (typeof ImageComponent)['prototype']['media'];
        

        所以对我来说,这满足了我对“typeof 的逆”的搜索。

        还要注意'IMAGE''VIDEO'literal types 而不是字符串(运行时它们只是字符串时除外)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-05-04
          • 2011-12-22
          • 2016-06-19
          • 2014-08-14
          • 2017-08-03
          • 1970-01-01
          • 2021-08-08
          • 2011-12-22
          相关资源
          最近更新 更多