【发布时间】:2015-11-27 16:29:54
【问题描述】:
我正在使用以下描述方法。即返回动态结果。
public static dynamic GetCouponDetailsbyCouponID(Guid couponID)
{
using (var loEntities = new Entities())
{
dynamic nonWinnerGift = (from nw in loEntities.CorporateNonWinnerGift
join um in loEntities.Users on nw.UserID equals um.Id
where nw.IsDeleted != true && nw.CouponID == couponID
select new
{
FullName = (um.FirstName + " " + um.LastName),
Title = nw.Title,
Description = nw.Description,
LogoName = nw.LogoName,
CouponID = nw.CouponID,
IsDiscount = nw.IsDiscount,
Discount = nw.Discount,
Desclaiemer = nw.Desclaiemer
}).SingleOrDefault();
return nonWinnerGift;
}
}
dynamic expandDoObject = new ExpandoObject();
当我尝试访问“couponData.LogoName”时,会抛出动态运行时异常。请在下面找到我的例外 “在 ClosetAuctions.dll 中发生了‘Microsoft.CSharp.RuntimeBinder.RuntimeBinderException’类型的第一次机会异常 附加信息:‘object’不包含‘LogoName’的定义”
var couponData = CorporateNonWinnerGiftBL.GetCouponDetailsbyCouponID(couponID);
if (couponData != null)
{
string fileName = couponData.LogoName;
}
【问题讨论】:
-
为什么要使用动态类型的代码来传递数据?这不是 javascript。
-
我有两个类,我想通过使用 linq 查询返回组合两个参数。而且我不想创建单独的课程。所以请建议我我需要做什么。
-
例如,返回一个聚合类。
class Result { public WinnerGift WinnerGift { get; set; } public User User { get; set; } } -
@decastro,感谢您的快速回复。但是,我不想创建一个新类。如果我通过使用两个类参数创建一个使用新类很容易,但我主要担心的是不想新类。
-
您正在返回一个匿名类型的实例。如果你没有使用
dynamic,你唯一的选择就是返回一个object——匿名类型在你自己的函数之外是未知的。如果你有一个object类型的变量,你会得到一个编译时错误,它没有LogoName属性。您对dynamic所做的只是将完全相同的查找规则推迟到运行时。在运行时,可以确定的最佳类型是object。