0

我可以解决这个问题,但我很好奇为什么它不起作用:

就像您可以为例程创建具有默认值的可选参数一样,例如下面的......

    public void SomeRoutine(string Title = "Missing")
    {
        // Do something with Title
    }

.... 为什么不能将默认类型指定为可选参数?

以下示例给出了错误: “'theType' 的默认参数必须是编译时间常数。”

    public void SomeOtherRoutine(Type theType = typeof(MyClass))
    {
        // Do something based on theType
    }

实际的应用程序试图提供枚举包含基类和各种派生类混合的集合的选项,并仅返回感兴趣的类类型:

    public IEnumerable<MyBaseClass> EnumerateWithOptions(Type optionalDerivedClass = typeof(MyBaseClass))
    {
        foreach (MyBaseClass thingy in MyCustomCollection())
        {
            if (thingy.GetType() == optionalDerivedClass)
            { yield return thingy; };
        }
    }

显而易见的替代方法是重载例程以应用默认值,如下所示,但是由于不值得尝试描述的原因,它在我的应用程序中并不理想。

    public IEnumerable<MyBaseClass> EnumerateWithOptions()
    {
        return EnumerateWithOptions(typeof(MyBaseClass));
    }
    public IEnumerable<MyBaseClass> EnumerateWithOptions(Type optionalDerivedClass)
    {
        foreach (MyBaseClass thingy in MyCustomCollection())
        {
            if (thingy.GetType() == optionalDerivedClass)
            { yield return thingy; };
        }
    }

为什么 typeof(MyClass) 不被视为编译时间常数的任何想法,或任何不同方法的想法?谢谢。

4

2 回答 2

1

因此,您不能使用typeof或某些Type值,并且您不想手动创建重载,然后考虑提供null作为可选参数的默认值:

IEnumerable<MyBaseClass> EnumerateWithOptions(Type optionalDerivedClass = null)
{
    if (optionalDerivedClass == null)
        return MyCustomCollection();

    return MyCustomCollection()
        .Where(thingy => thingy.GetType() == optionalDerivedClass);
}

如果您可以使用泛型参数而不是Type对象,那么您可以通过以下方式过滤集合Enumerable.OfType<T>()

IEnumerable<MyBaseClass> result = MyCustomCollection().OfType<YourType>();
于 2012-12-05T22:48:11.963 回答
0

你可以做这样的事情

  public IEnumerable<MyBaseClass> EnumerateWithOptions<T>()
  {
      foreach (MyBaseClass thingy in MyCustomCollection())
      {
         if (thingy.GetType() == typeof(T))
         { yield return thingy; };
      }
  }

用法

var list = EnumerateWithOptions<MyBaseClass>();
var list = EnumerateWithOptions<MyDerivedClass>();
于 2012-12-05T22:50:38.580 回答