我怎么能定义匿名类型?

时间:2011-09-10 10:05:05

标签: .net asp.net-mvc-3 c#-4.0 anonymous-types

我有一个匿名类型变量,我正在填充这样的变量(我有两个变量jsonDataCachejsonData,但我想只有一个,例如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);
}               

3 个答案:

答案 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)

目前还不清楚你为什么要这样做,但这是一种方式:

您可以将对象创建为objectdynamic

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 {[...]}
}