c# - 无法理解 C# 泛型

标签 c# generics

我能够理解 C# 泛型,但只有当我在一本示例易于理解的书中读到它时。但在现实生活中,我看到了如下所示的复杂 C# 泛型代码。有人可以向我解释这段代码的通用方面吗?我看到了类型参数,但不明白为什么 T 没有在方法主体中使用。 T 在体内如何使用?

public void ValidateExceptionFromResponse<T>( BaseClaimResponseDataContract<T> response )
    {
        if (response.CommunicationResponseCodes != null && response.CommunicationResponseCodes.Any())
        {
            var validateResult = new ValidationResults();
            foreach (var communicationResponseCodeDataContract in response.CommunicationResponseCodes)
            {
                validateResult.AddResult( new ValidationResult(communicationResponseCodeDataContract.Description.Current, null, null, null, null));
            }
            throw FaultManager.GenerateFault(validateResult);
        }
        if( response.MessageError != null )
        {
            throw FaultManager.GenerateFault(eErrorCodes.Claims, response.MessageError.Current);
        }
    }

这是 BaseClaimResponseDataContract 的一个片段:

[KnownType(typeof(SummaryClaimsReportResponseDataContract))]
[KnownType(typeof(ClaimResponseDataContract))]
[KnownType(typeof(CommunicationResponseDataContract))]
[DataContract]
public class BaseClaimResponseDataContract<T>
{
    [DataMember]
    public bool IsRxClaim { get; set; }

    [DataMember]
    public ThirdPartyDataContract ThirdParty { get; set; }

    [DataMember]
    public ExternalSystemMessages RequestMessage { get; set; }

    [DataMember]
    public bool RequestAccepted { get; set; }

    [DataMember]
    public string ResponseStatus { get; set; }

    [DataMember]
    [StringLength(10)]
    public string ResponseCodes { get; set; }

    [DataMember]
    public string[] ResponseCodesArray
    {
        get
        {
            var lstMessageCodes = new List<string>();

            if (!string.IsNullOrEmpty(ResponseCodes))
            {
                for (int i = 0; i < ResponseCodes.Length / 2; i++)
                {
                    var code = ResponseCodes.Substring(i*2, 2);
                    if (!string.IsNullOrWhiteSpace(code))
                        lstMessageCodes.Add(code);
                }
            }

            return lstMessageCodes.ToArray();
        }
    }

    [DataMember]
    public IEnumerable<CommunicationResponseCodeDataContract> CommunicationResponseCodes;

    [DataMember]
    public StringDataContract MessageError { get; set; }

    public void CopyFrom(BaseClaimResponseDataContract<T> claimResponse)
    {
        IsRxClaim = claimResponse.IsRxClaim;
        ThirdParty = claimResponse.ThirdParty;
        RequestMessage = claimResponse.RequestMessage;
        RequestAccepted = claimResponse.RequestAccepted;
        ResponseStatus = claimResponse.ResponseStatus;
        ResponseCodes = claimResponse.ResponseCodes;
        CommunicationResponseCodes = claimResponse.CommunicationResponseCodes;
        MessageError = claimResponse.MessageError;
    }
}

最佳答案

在这种情况下,通用参数的唯一目的似乎是强制方法的参数必须是 BaseClaimResponseDataContract<T>。 .我怀疑您的解决方案中有多种类型继承自此,例如:

public class SomeSample : BaseClaimResponseDataContract<AnotherClass> 
{
}

该方法只能用实现该基类型的实例调用,所以它就像是一种用接口(interface)标记类的形式。

关于c# - 无法理解 C# 泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21149528/

相关文章:

c# - 如何防止任务的同步延续?

c# - WPF:多个屏幕

c# - 验证消息颜色 ASP.NET MVC 4

generics - 如何在 F# 中做一个 Applicative?

php - 在 PHP 中模拟泛型类

java - 泛型,Guava Ordering.arbitrary()

c# - System.Web.Mvc.HtmlHelper 不包含 MvcSiteMap 的定义

c# - 代码没有遍历整个字典?

c# 测试对象是否使用 .GetType().GetInterface(typeof(ISurface<>).FullName) 实现任何类型的 ISurface<T>

java - 你能指定一个泛型类型来子类化另一个泛型类型_和_一个具体的接口(interface)吗?