相关疑难解决方法(0)

.NET中的"开放通用类型"究竟是什么?

我正在通过Asp.Net MVC课程并了解到,对于一种方法来确定控制器的动作,

  • 它必须没有"开放的通用类型"

我对某些泛型有所了解并在某种程度上使用它们,但是:

  • 什么是.Net中的开放泛型类型.
  • 是否存在封闭的泛型类型
  • 开放泛型类型是一个不经常使用的术语.与它混淆使用的是什么?

.net c# generics open-generics

114
推荐指数
4
解决办法
3万
查看次数

泛型 - 打开和关闭构造的类型

最近我注意到通用构造类型可以打开和关闭.但我不明白他们究竟是什么意思.你能举一个简单的例子吗?

c# generics

50
推荐指数
2
解决办法
2万
查看次数

Type.IsGenericTypeDefinition和Type.ContainsGenericParameters之间的区别

System.Type类型包含属性IsGenericTypeDefinitionContainsGenericParameters.阅读完MSDN文档后,我得出结论,两个属性都存在,以检查类型是开放类型还是封闭类型.

但是,我没有看到两者之间的区别,以及何时想要使用另一个.

.net c# generics reflection

20
推荐指数
2
解决办法
2012
查看次数

IsGenericType和IsGenericTypeDefinition之间的区别

Type.IsGenericType和之间有什么区别Type.IsGenericTypeDefinition?有趣的是,MSDN的IsGenericTypeDefinition链接已被破坏.

在尝试检索给定DbContext中定义的所有DbSets后,我发现了以下内容,我试图理解这种行为:通过IsGenericType过滤属性返回所需的结果,而不使用IsGenericTypeDefinition(不返回任何).

有趣的是,从这篇文章中我得到的印象是作者使用IsGenericTypeDefinition获得了他的DbSets,而我却没有.

按照说明讨论的示例:

private static void Main(string[] args)
{
    A a = new A();
    int propertyCount = a.GetType().GetProperties().Where(p => p.PropertyType.IsGenericType).Count();
    int propertyCount2 = a.GetType().GetProperties().Where(p => p.PropertyType.IsGenericTypeDefinition).Count();

    Console.WriteLine("count1: {0}  count2: {1}", propertyCount, propertyCount2);
}

// Output: count1: 1  count2: 0

public class A
{
    public string aaa { get; set; }
    public List<int> myList { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

c# generics reflection system.type

14
推荐指数
1
解决办法
5273
查看次数

检测泛型类型是否已打开?

我的程序集中有一堆常规,封闭和打开的类型.我有一个查询,我试图排除它的开放类型

class Foo { } // a regular type
class Bar<T, U> { } // an open type
class Moo : Bar<int, string> { } // a closed type

var types = Assembly.GetExecutingAssembly().GetTypes().Where(t => ???);
types.Foreach(t => ConsoleWriteLine(t.Name)); // should *not* output "Bar`2"
Run Code Online (Sandbox Code Playgroud)

在调试open类型的泛型参数时,我发现它们FullName是null(以及其他类似的东西DeclaringMethod) - 所以这可能是一种方式:

    bool IsOpenType(Type type)
    {
        if (!type.IsGenericType)
            return false;
        var args = type.GetGenericArguments();
        return args[0].FullName == null;
    }

    Console.WriteLine(IsOpenType(typeof(Bar<,>)));            // true
    Console.WriteLine(IsOpenType(typeof(Bar<int, string>)));  // false
Run Code Online (Sandbox Code Playgroud)

有没有内置的方法来知道类型是否打开?如果没有,有没有更好的方法呢?谢谢.

c# reflection generic-type-argument

4
推荐指数
2
解决办法
791
查看次数