C#-静态类型不能用作类型参数
我有一个泛型类,它帮助我检查参数值C#-静态类型不能用作类型参数,c#,generics,static,C#,Generics,Static,我有一个泛型类,它帮助我检查参数值 internal sealed class Argument<T> where T : class { private void TraceAndThrow(Exception ex) { new InternalTraceHelper<T>().WriteError(ex); throw ex; } internal void ThrowNull(object
internal sealed class Argument<T>
where T : class
{
private void TraceAndThrow(Exception ex)
{
new InternalTraceHelper<T>().WriteError(ex);
throw ex;
}
internal void ThrowNull(object value, string argName)
{
if (ReferenceEquals(value, null))
{
TraceAndThrow(new ArgumentNullException(argName));
}
}
internal void ThrowIf(bool condition, string argName)
{
if (condition)
{
TraceAndThrow(new ArgumentException(null, argName));
}
}
internal void ThrowNotInEnum(Type enumType, object value)
{
if (!Enum.IsDefined(enumType, value))
{
TraceAndThrow(new ArgumentOutOfRangeException(Resources.ArgEnumIllegalVal.InvariantFormat(value)));
}
}
}
内部密封类参数
T:在哪里上课
{
私有无效跟踪和工作流(例外情况除外)
{
新的InternalTraceHelper().WriteError(ex);
掷骰子;
}
内部void ThrowNull(对象值,字符串argName)
{
if(ReferenceEquals(value,null))
{
TraceAndThrow(新ArgumentNullException(argName));
}
}
内部void ThrowIf(布尔条件,字符串argName)
{
如果(条件)
{
TraceAndThrow(新ArgumentException(null,argName));
}
}
内部void ThrowNotInEnum(类型enumType,对象值)
{
如果(!Enum.IsDefined(enumType,value))
{
TraceAndThrow(新ArgumentOutOfRangeException(Resources.ArgEnumIllegalVal.InvariantFormat(value));
}
}
}
但当我尝试将其用于静态类时:
internal static class Class1
{
private static Argument<Class1> _arg;
}
内部静态类Class1
{
私有静态参数_arg;
}
我(在编译时)遇到了以下错误:
静态类型不能用作类型参数
我做错了什么?泛型只适用于实例,而不适用于静态类。您做错的是使用静态类型作为泛型类型参数 因为静态类不能实例化,所以它永远不能用静态类型创建
参数。因为静态类没有实例成员,所以我关心的是我将如何处理它们
我认为,由于不能使用静态类作为泛型参数,因此需要使用扩展方法而不是泛型类来实现这一点
这是故意的
静态类试图防止不适当的使用,所以在几乎所有的情况下,您都不能在通常需要类型的实例的情况下使用它们。。。这包括类型参数
有关可以引用静态类类型的非常有限的一组情况,请参见第节。是否有解决方法?我怎么办?我不会在静态类中“手动”检查,在非静态类中使用参数
。不,除了使用系统之外没有其他方法。键入
@Arnaud,您不能将静态类型作为参数传递,因此我看不到您何时想要使用参数
,除非我被你的类名误导了。我的静态类是非静态的,但是使用私有构造函数就可以了?因此,没有人可以实例化它,但它是非静态的。这是一个很好的方法吗?是的,这绝对是一个信息丰富的答案。你为什么要费心写这么长的文本呢?用一个私有构造函数来完成我的静态类,而不是静态类?因此,没有人可以实例化它,但它是非静态的。这是一种很好的方式吗?(谢谢这一节,我已经读过了)@Arnaud F:好吧,那会有用的——但是你用类型参数做什么呢?这有什么意义?它似乎只被InternalTraceHelper
使用,我们不知道它是什么样子。InternalTraceHelper
执行Trace.Write()
,参数类型用于定义跟踪的类别。可替换为Trace.WriteLine(“消息”,typeof(T).FullName);//其中T=Class1
@Arnaud F.:听起来您可能想要一个非通用版本的InternalTraceHelper,它采用类型
。事实上,您可以使整个类成为非泛型类,只需使用泛型方法来简化创建:InternalTraceHelper.Create
将调用newinternalTraceHelper(typeof(T))
其中T
是该方法的类型参数。非常感谢tip Master!这是不正确的。ILogger是一个示例,其中该类成为记录器在发出诊断时要使用的类别。这是一条愚蠢的规则。@Quarkly,你找到解决办法了吗?现在考虑让类成为非静态的