我有一个匿名类型变量,我正在填充这样的变量(我有两个变量jsonDataCache
和jsonData
,但我想只有一个,例如jsonData
:
var jsonData = new
{
total = totalPages,
page = page,
records = totalRecords,
rows = (from b in myData
select new
{
//do things
}).ToArray()
};
return Json(jsonData, JsonRequestBehavior.AllowGet);
但是如果我想首先定义这个变量,在我填充之前,基本上我想做那样的事情:
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);
我怎么能这样做?
我想这样做的原因是因为我想引入缓存,所以我需要先定义变量第一个ant而不是检查缓存中的内容,如果不是,我会做上面的事情。 目前我用两个变量做了这个,我只想使用一个。
以下是我目前的做法:
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);
}
更新 在你所有的帮助之后,我认为应该是这样的,希望这是正确的方法:
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);
}
答案 0 :(得分:3)
好吧,您可以“通过示例”创建它 - 使用相同的属性名称和类型,以相同的顺序,只使用虚拟值。例如:
var jsonData = new { total = 0, page = 0, records = 0,
rows = new[] { new { dummy = "" } };
目前还不清楚你想要嵌套的匿名类型做什么,所以我只创建了一个名为dummy
的字符串属性。
请注意,我尝试以避免正常做这类事情......正如Marc所说,如果你能解释一下大局,它将帮助我们更多地帮助你。
编辑:如果它是用于缓存的,那么您期望如何以静态类型的方式创建声明缓存?您声明接受的Json方法是什么?如果它被声明接受object
,那么你不需要需要一个强类型变量,对吗?如果它是通用的,那很好 - 但它会回到你如何设法适当地投射出缓存中的任何东西......
答案 1 :(得分:2)
你不能这样做(并初始化为null),除了一些非常讨厌和丑陋的“通过示例”策略与泛型方法。匿名类型的变量只能与初始化一起声明(除了作为泛型类型参数)。
但是,你确实不太可能在这里需要它。事实上,
object jsonData;
就足够了,因为你永远不会使用这个值。除此之外,我认为现在是时候为此目的引入DTO课程了。
答案 2 :(得分:1)
目前还不清楚你为什么要这样做,但这是一种方式:
您可以将对象创建为object
或dynamic
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;
}
您可以使用:
var jsonData = Cache.GetOrStore("jsonData", Foo);
其中:
private static string Foo()
{
return new {[...]}
}