gpt4 book ai didi

c# - 为什么我不能实例化一个从匿名对象推断类型的泛型类?

转载 作者:太空宇宙 更新时间:2023-11-03 11:10:25 27 4
gpt4 key购买 nike

假设我有一些类(class) - 假设示例:

public class InvalidResponseException<TReq, TResp> : Exception
{
public TReq RequestData { get; protected set; }
public TResp ResponseData { get; protected set; }

public InvalidResponseException(string message, TReq requestData, TResp responseData)
: this(message, null, requestData, responseData)
{
}

public InvalidResponseException(string message, Exception innerException, TReq requestData, TResp responseData)
: base(message, innerException)
{
RequestData = requestData;
ResponseData = responseData;
}
}

好的,类定义...并编译,没问题。

所以让我们在我的代码主体的其他地方说,我想抛出这个异常并将一个匿名对象传递到我的一个或多个类型的异常中。这应该使它足够通用,以便我可以在代码库中从某些调用获得意外响应的任何地方使用它:

var reqData = new { 
Context = SomeDataContext,
Username = SomeUserName,
ParentID = 54,
RequestValues = ListOfItemsToGet
}

var respData = results.ToList();

string exceptionMessage = string.Format("Invalid response data detected. Requested {0} items received {1}.", ListOfItemsToGet.Count(), results.Count());

throw new InvalidResponseException(exceptionMessage, reqData, respData);

对于大多数匿名调用,您可以使用类型推断,因此您不必在方法调用中定义类型...但是这段代码无法编译。

如果我将鼠标悬停在 reqData 的“var”上,编译器会告诉我为它定义了一个类型,尽管这是一个奇怪的名称,没有人可以手动分配...所以理论上我认为可以从中推断出类型那。

我最初的结论是你不能将匿名类型传递给泛型,但你确实可以通过某种方式将匿名对象传递给泛型:

var BritishExpats = from p in People
where p.CountryOfBirth == "United Kingdom" && p.CountryOfResidents != p.CountryOfBirth
select new { FirstName = p.FirstName, LastName = p.LastName }

此处“BritishPeople”是一个 IEnumerable ,其中 T 被推断为 'a

...我可以遍历生成的匿名对象的 IEnumerable 并毫无问题地引用它们的公共(public)属性...

foreach (var ExPat in BritishExpats)
{
Console.WriteLine("{0}, {1}", Expat.LastName, Expat.FirstName);
}

当然,我必须在循环中使用“var”,因为我们真的不知道“BritishExpats”是什么类型。

所以我可以使用匿名对象推断的类型来实例化某些类型的类,但不能实例化其他类型...

...关于什么可以和不能由匿名对象实例化、推断和不推断,是否有押韵或原因?

最佳答案

您不能在构造函数中将泛型、匿名类型和类型推断放在一起。编译器就是不会得到它。您可以通过辅助类创建解决方法,例如:

public static class InvalidResponseExceptionHelper
{
public static InvalidResponseException<TReq, TResp> Create<TReq, TResp>
(string message, TReq requestData, TResp responseData)
{
return new InvalidResponseException<TReq, TResp>(message,
requestData, responseData);
}
}

此外,我没有提到它,但是您的 InvalidResponseException 类将无法编译,除非进行大量修改。但是,您的问题的概念通过了。

关于c# - 为什么我不能实例化一个从匿名对象推断类型的泛型类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14271661/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com