C# 需要C中的泛型构造函数吗
我想为下面的代码创建泛型构造函数 因为不同的枚举将在下面的场景中添加。我希望这个类是泛型的C# 需要C中的泛型构造函数吗,c#,visual-studio-2010,wcf,generics,C#,Visual Studio 2010,Wcf,Generics,我想为下面的代码创建泛型构造函数 因为不同的枚举将在下面的场景中添加。我希望这个类是泛型的 using System.Runtime.Serialization; using TT.SharedServices.Utils; namespace TT.Core { [DataContract(Namespace = "SharedServices")] public class Error { /// <summary> /// Gets or Sets Error
using System.Runtime.Serialization;
using TT.SharedServices.Utils;
namespace TT.Core
{
[DataContract(Namespace = "SharedServices")]
public class Error
{
/// <summary>
/// Gets or Sets Error Code
/// </summary>
[DataMember]
public int ErrorCode { get; set; }
/// <summary>
/// Gets or Sets detailed error message
/// </summary>
[DataMember]
public string ErrorMessage { get; set; }
public Error()
{
ErrorMessage = NullValues.NullString;
ErrorCode = NullValues.NullInt;
}
public Error(AuthenticateErrorType errorType, string errorMessage)
{
ErrorCode = (int) errorType;
ErrorMessage = errorMessage;
}
public Error(LoadMemberErrorType errorType, string errorMessage)
{
ErrorCode = (int)errorType;
ErrorMessage = errorMessage;
}
}
}
建议我克服这种情况的最佳优化方法?您可以使用非通用代码,例如
public Error(Enum errorType, string errorMessage)
{
ErrorCode = (int)(object)errorType;
ErrorMessage = errorMessage;
}
不管怎样,Generis不会有多大帮助您可以使用非泛型代码,例如
public Error(Enum errorType, string errorMessage)
{
ErrorCode = (int)(object)errorType;
ErrorMessage = errorMessage;
}
不管怎样,Generis不会有多大帮助您可以考虑创建一个泛型工厂方法来创建实例,而不是构造函数:
public static Error CreateError<T>(T errorType, string errorMessage)
{
// Add if (!typeof(T).IsEnum) throw ... here if you wish
return new Error()
{
ErrorCode = (int)(object)errorType,
ErrorMessage = errorMessage
};
}
希望在C的未来版本中,它会更容易,如第8点所述。文章中的构造函数类型参数推断。您可以考虑创建一个泛型工厂方法来创建实例,而不是构造函数:
public static Error CreateError<T>(T errorType, string errorMessage)
{
// Add if (!typeof(T).IsEnum) throw ... here if you wish
return new Error()
{
ErrorCode = (int)(object)errorType,
ErrorMessage = errorMessage
};
}
希望在C的未来版本中,它会更容易,如第8点所述。文章中的构造函数类型参数推断。用户以下代码:
[DataContract(Namespace = "SharedServices")]
public class Error<T>
{
/// <summary>
/// Gets or Sets Error Code
/// </summary>
[DataMember]
public int ErrorCode { get; set; }
/// <summary>
/// Gets or Sets detailed error message
/// </summary>
[DataMember]
public string ErrorMessage { get; set; }
public Error()
{
ErrorMessage = NullValues.NullString;
ErrorCode = NullValues.NullInt;
}
public Error(T errorType, string errorMessage)
{
ErrorCode = Convert.ToInt32(errorType);
ErrorMessage = errorMessage;
}
}
用户代码如下:
[DataContract(Namespace = "SharedServices")]
public class Error<T>
{
/// <summary>
/// Gets or Sets Error Code
/// </summary>
[DataMember]
public int ErrorCode { get; set; }
/// <summary>
/// Gets or Sets detailed error message
/// </summary>
[DataMember]
public string ErrorMessage { get; set; }
public Error()
{
ErrorMessage = NullValues.NullString;
ErrorCode = NullValues.NullInt;
}
public Error(T errorType, string errorMessage)
{
ErrorCode = Convert.ToInt32(errorType);
ErrorMessage = errorMessage;
}
}
由于它是一个DataContract,泛型并不像您想象的那样得到很好的支持。在调用构造函数之前,您可能会将errorType更改为int?因为它是一个DataContract,泛型并不像您假设的那样得到很好的支持。你也许可以在调用构造函数之前将errorType改为int?删除我的帖子,支持这篇文章;这里最接近我想看到的特性是一种让构造函数参数参与字段或属性初始化的方法。一般来说,允许这样做,而不是要求整个类具有某种形式,这样可以避免在源中的不同位置进行字段声明和初始化,并且还允许在调用基构造函数之前初始化其初始化依赖于构造函数参数的字段。你知道有没有讨论过这样的事情吗?删除了我的帖子,选择了这篇;这里最接近我想看到的特性是一种让构造函数参数参与字段或属性初始化的方法。一般来说,允许这样做,而不是要求整个类具有某种形式,这样可以避免在源中的不同位置进行字段声明和初始化,并且还允许在调用基构造函数之前初始化其初始化依赖于构造函数参数的字段。你知道在什么地方讨论过这样的事情吗?