【问题标题】:How to make method to return generic type?如何使方法返回泛型类型?
【发布时间】:2023-03-12 06:20:01
【问题描述】:

我有一个名为 config 的类,其中有一个名为 key 的字符串字段。

当我应用该类的 GET 属性时,该属性必须返回一个不同类型(Int 或 bool 或 String)的变量键。

我实现如下:

  public enum RetType {RetInt, RetBool, RetString};
  ...
  public object PolimorphProperty(string key, RetType how) 
  {
      get 
     { 
        switch (how)
        {
         case RetType.RetInt:
           ...;
        case RetType.RetBool:
           ...;
        case RetType.RetString:
           ...;
        }
     }  
 }

但是PolimorphProperty返回Object类型的问题。

我应该在代码中更改什么以获得适当的类型(int、bool、string),而不是对象?

【问题讨论】:

标签: c# .net generics


【解决方案1】:

这样做:

public T PolimorphProperty<T>(string key)
{
    return (T) objectInstanceHere;
}

用法示例:

int i = PolimorphProperty<int>("somekey");

这支持http://www.antiifcampaign.com/

在多态代码中尽可能避免switchif

【讨论】:

    【解决方案2】:
    public T PolimorphProperty<T>(string key, T how)
    {
        //todo
    }
    

    【讨论】:

    • 在这种情况下,第二个参数可以不受影响地删除
    • 很明显,但你还是不要删除它
    • 请注意,您不能让编译器确保Tintboolstring。如果它不是其中之一,充其量你可以抛出一个异常。尽管如此,我认为签名public T PolimorphProperty&lt;T&gt;(string key) 可能是您问题的最佳解决方案。
    • @burning_LEGION 你打算如何调用你的 PolimorphProperty?想举个例子吗?
    【解决方案3】:

    C# 中的任何type实际上都是一个对象。
    根据我从您的问题中了解到的情况,您这样称呼您的方法:
    PolimorpthProperty(key, RetType.SomeType)
    该方法返回一个对象。你应该这样使用它:
    int key = (int)PolimorthProperty(key, RetType.RetInt);
    这称为Unboxing

    【讨论】:

      【解决方案4】:

      这个怎么样,考虑到'PolimorphProperty'的原始实现仍然是你的项目,你添加这个:

      public TType PolimorphProperty<TType>(string key, RetType how) 
       {
           return (TType)PolimorphProperty(key, how);
       }
      

      【讨论】:

        【解决方案5】:

        如果我理解正确,您正在寻找这样的东西:

        public T GenericMethod<T>(string key)
        {
            var ret = new object(); // Retrieve object from whatever...
            return (T) ret;
        }
        
        public void UsageExample()
        {
            int typedResult = GenericMethod<int>("myKey");
        }
        

        如果您尝试使用不同的逻辑基于类型 T 获取不同的对象,那么无论如何您都必须打开类型,因为除非您的集合支持某种类型的对象(它们通常支持),否则编译器不会不知道该怎么办。
        在这种情况下,请检查此question

        【讨论】:

          猜你喜欢
          • 2016-12-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-07-18
          相关资源
          最近更新 更多