.net 如何定义匿名类型?
我有这样填充的匿名类型变量(我有两个变量.net 如何定义匿名类型?,.net,asp.net-mvc-3,c#-4.0,anonymous-types,.net,Asp.net Mvc 3,C# 4.0,Anonymous Types,我有这样填充的匿名类型变量(我有两个变量jsonDataCache和jsonData,但我只想有一个,jsonData): 但如果我想先定义这个变量,在填充之前,基本上我想这样做: var jsonData = null; //check if jsonData in cache and if it is return Json(jsonData, JsonRequestBehavior.AllowGet); jsonData = new {
jsonDataCache
和jsonData
,但我只想有一个,jsonData
):
但如果我想先定义这个变量,在填充之前,基本上我想这样做:
var jsonData = null;
//check if jsonData in cache and if it is return Json(jsonData, JsonRequestBehavior.AllowGet);
jsonData = new
{
total = totalPages,
page = page,
records = totalRecords,
rows = (from b in myData
select new
{
//do things
}).ToArray()
};
//put jsonData in cache by key
return Json(jsonData, JsonRequestBehavior.AllowGet);
我怎么能这么做
我之所以这样做是因为我想引入缓存,所以我需要首先定义变量,然后在缓存中检查它,如果不是,我将执行上面的操作。
目前我用两个变量来实现,我只想用一个变量
以下是我目前的做法:
public virtual JsonResult GetSomething(int id, int type)
{
string keyPrefix = GetKeyPrefix(id, type);
var jsonDataCache = CacheManager.Get<object>(keyPrefix);
if(jsonDataCache != null)
return Json(jsonDataCache, JsonRequestBehavior.AllowGet);
var myData = GetFromDataase();
var jsonData = new
{
total = totalPages,
page = page,
records = totalRecords,
rows = (from b in myData
select new
{
//do things
}).ToArray()
};
CacheManager.Set<object>(keyPrefix, jsonData);
return Json(jsonData, JsonRequestBehavior.AllowGet);
}
公共虚拟JsonResult GetSomething(int-id,int-type)
{
字符串keyPrefix=GetKeyPrefix(id,type);
var jsonDataCache=CacheManager.Get(keyPrefix);
if(jsonDataCache!=null)
返回Json(jsonDataCache,JsonRequestBehavior.AllowGet);
var myData=GetFromDataase();
var jsonData=new
{
总计=总页数,
第页,
记录=总记录,
行=(来自myData中的b)
选择新的
{
//做事
}).ToArray()
};
Set(keyPrefix,jsonData);
返回Json(jsonData、JsonRequestBehavior.AllowGet);
}
更新:
在你们的帮助下,我认为应该是这样,希望这是正确的方向:
public virtual JsonResult GetSomething(int id, int type)
{
string keyPrefix = GetKeyPrefix(id, type);
var jsonData = CacheManager.Get<object>(keyPrefix);
if(jsonData != null)
return Json(jsonData , JsonRequestBehavior.AllowGet);
var myData = GetFromDataase();
jsonData = new
{
total = totalPages,
page = page,
records = totalRecords,
rows = (from b in myData
select new
{
//do things
}).ToArray()
};
CacheManager.Set<object>(keyPrefix, jsonData);
return Json(jsonData, JsonRequestBehavior.AllowGet);
}
公共虚拟JsonResult GetSomething(int-id,int-type)
{
字符串keyPrefix=GetKeyPrefix(id,type);
var jsonData=CacheManager.Get(keyPrefix);
if(jsonData!=null)
返回Json(jsonData、JsonRequestBehavior.AllowGet);
var myData=GetFromDataase();
jsonData=新
{
总计=总页数,
第页,
记录=总记录,
行=(来自myData中的b)
选择新的
{
//做事
}).ToArray()
};
Set(keyPrefix,jsonData);
返回Json(jsonData、JsonRequestBehavior.AllowGet);
}
好吧,您可以“通过示例”创建它——使用相同的属性名称和类型,以相同的顺序,仅使用伪值。例如:
var jsonData = new { total = 0, page = 0, records = 0,
rows = new[] { new { dummy = "" } };
不清楚您希望嵌套匿名类型做什么,所以我只创建了一个名为dummy
的字符串属性
请注意,我会尽量避免正常地做这种事情。。。正如马克所说,如果你能解释更大的图景,它将帮助我们帮助你更多
编辑:如果是为了缓存,那么您希望如何以静态类型的方式创建声明缓存?您声明接受的Json方法是什么?如果声明接受对象
,则不需要强类型变量,对吗?如果它是泛型的,那很好——但它将回到如何适当地强制转换缓存中的任何内容…好吧,您可以“通过示例”创建它——使用相同的属性名称和类型,以相同的顺序,仅使用伪值。例如:
var jsonData = new { total = 0, page = 0, records = 0,
rows = new[] { new { dummy = "" } };
不清楚您希望嵌套匿名类型做什么,所以我只创建了一个名为dummy
的字符串属性
请注意,我会尽量避免正常地做这种事情。。。正如马克所说,如果你能解释更大的图景,它将帮助我们帮助你更多
编辑:如果是为了缓存,那么您希望如何以静态类型的方式创建声明缓存?您声明接受的Json方法是什么?如果声明接受
对象
,则不需要强类型变量,对吗?如果它是通用的,那很好-但它将返回到如何适当地强制转换缓存中的任何内容…不清楚为什么要这样做,但这里有一种方法:
您可以将对象创建为类型对象
或动态
object foo = null;
foo = new {
bar = "bar"
};
更新:
鉴于你的更新,我认为有一个更合适的方法来做到这一点
就我个人而言,我使用System.Web.Caching.Cache
,并且有一个扩展方法来检查缓存中的项目(基于缓存键),或者执行您的方法来检索数据
public static T GetOrStore<T>(this Cache cache, string key, Func<T> generator)
{
var result = cache.Get(key);
if(result == null)
{
result = generator();
cache.Insert(key,result);
}
return (T) result;
}
其中:
private static string Foo()
{
return new {[...]}
}
不清楚您为什么要这样做,但有一种方法: 您可以将对象创建为类型
对象
或动态
object foo = null;
foo = new {
bar = "bar"
};
更新:
鉴于你的更新,我认为有一个更合适的方法来做到这一点
就我个人而言,我使用System.Web.Caching.Cache
,并且有一个扩展方法来检查缓存中的项目(基于缓存键),或者执行您的方法来检索数据
public static T GetOrStore<T>(this Cache cache, string key, Func<T> generator)
{
var result = cache.Get(key);
if(result == null)
{
result = generator();
cache.Insert(key,result);
}
return (T) result;
}
其中:
private static string Foo()
{
return new {[...]}
}
你不能这样做(并初始化为null),除了一些使用泛型方法的非常讨厌和丑陋的“举例”策略。匿名类型的变量只能在初始化时声明(泛型类型参数除外)
然而,你似乎不太可能真的需要它。的确
object jsonData;
这就足够了,因为您从未使用该值。除此之外,我认为是时候引入DTO类了。你不能这样做(并初始化为null),除了一些非常讨厌的、丑陋的、带有泛型方法的“通过示例”策略。匿名类型的变量只能在初始化时声明(泛型类型参数除外)
然而,你似乎不太可能真的需要它。的确
object jsonData;
这就足够了,因为您从未使用该值。除此之外,我认为是时候引入DTO类了。为什么