powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / IndexOutOfRangeException: Объясните дураку КАК такое вообще может быть?
10 сообщений из 35, страница 2 из 2
IndexOutOfRangeException: Объясните дураку КАК такое вообще может быть?
    #38225955
cooldeveloper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степиЧто то не могу понять зачем кеширование в нутрях происходит IDataReader - жирновато, ну да ладно.
Всё правильно они делают, один раз получают свойство, а все последующие разы свойство достается из словаря.
Наподобие вот этого: Рецепт - Emit property set-get value (Алексей К писал, я подпилил немного)
...
Рейтинг: 0 / 0
IndexOutOfRangeException: Объясните дураку КАК такое вообще может быть?
    #38226039
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cooldeveloper,
в том то и дело, никаких словарей я не увидел или на что то похожее типа этого
Код: c#
1.
2.
3.
4.
  static  class  PropertyInfoCashe<T> 
    {
       static  Lazy<List<PropertyInfo>> listPi=new Lazy<List<PropertyInfo>>(() => typeof (T).GetProperties().ToList());
    }
...
Рейтинг: 0 / 0
IndexOutOfRangeException: Объясните дураку КАК такое вообще может быть?
    #38226054
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cooldeveloper,
Ну да бог с ним не велика безделица, свою написать на раз проблем нет, может не увидел.
В общем то и полез прозекцировать из за этого момента...
...
Рейтинг: 0 / 0
IndexOutOfRangeException: Объясните дураку КАК такое вообще может быть?
    #38226058
cooldeveloper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степи, мне лениво изучать их исходники. Лучше возьми коллекцию их нескольких десятков млн элементов и потестрируй на скорость все три маппера. Emit должен всех порвать.
...
Рейтинг: 0 / 0
IndexOutOfRangeException: Объясните дураку КАК такое вообще может быть?
    #38226064
cooldeveloper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cooldeveloperEmit должен всех порвать.
Точно, как же я забыл про Emit. Вот он , дополнил коллекцию мапперов.

P.S. Но как по мне, лучше иметь свой класс маппера из пары строк кода, чем тянуть эти левые кодплексовские сборки.
...
Рейтинг: 0 / 0
IndexOutOfRangeException: Объясните дураку КАК такое вообще может быть?
    #38226079
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot cooldeveloper]cooldeveloperP.S. Но как по мне, лучше иметь свой класс маппера из пары строк кода, чем тянуть эти левые кодплексовские сборки.
Тут полностью с тобой согласен, не велика важность в этих сборках, тем более если смотреть сточки зрения датамаппера
тянут они 90 процентов баласта.Самое главное принцип действия знать - быть вооруженным.
...
Рейтинг: 0 / 0
IndexOutOfRangeException: Объясните дураку КАК такое вообще может быть?
    #38226097
cooldeveloper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степитянут они 90 процентов баласта.Самое главное принцип действия знать - быть вооруженным.
+1
Тем более реальная разница замечается на десятках миллионах элементов. Как часто ты маппишь такое кол-во данных? У меня еще ни разу таких задач не было. Максимум, несколько десятков тысяч, которые маппятся за секунду и того меньше.
Опять же, если нужна небольшая оптимизация и скорострельность, ее можно повысить процентов на 15% за счет кеширования и Emit доступа к свойствам. Просто берем и докручиваем этот Emit к своему мапперу. Лично пробовал, особо сильного профита я не получил, зато гавнокода добавилось немало. Сам зацени на эту жесть:
emit
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Reflection.Emit;

namespace Application.Emit
{
    public class EmitTypeInfo
    {
        public EmitTypeInfo(object obj)
        {
            Member = obj;
        }

        class EmitPropertyInfoCollection
        {
            public EmitPropertyInfo[] Items;
            public Dictionary<string, EmitPropertyInfo> ByName;
        }

        class CacheDictionary : Dictionary<Type, EmitPropertyInfoCollection>
        {

        }

        CacheDictionary Cache = new CacheDictionary();

        object Member;

        public IEnumerable<EmitPropertyInfo> GetProperties()
        {
            return GetPropertiesInternalCollection(Member.GetType()).Items;
        }

        public EmitPropertyInfo GetProperty(string propertyName)
        {
            EmitPropertyInfo result;

            if (GetPropertiesInternalCollection(Member.GetType()).ByName.TryGetValue(propertyName, out result))
            {
                return result;
            }
            else
            {
                return default(EmitPropertyInfo);
            }
        }

        EmitPropertyInfoCollection GetPropertiesInternalCollection(Type type)
        {
            lock (Cache)
            {
                EmitPropertyInfoCollection result;
                if (!Cache.TryGetValue(type, out result))
                {
                    var items = CreateEmitProperties(type).ToArray();
                    result = new EmitPropertyInfoCollection
                    {
                        Items = items,
                        ByName = items.ToDictionary(v => v.Property.Name)
                    };

                    Cache.Add(type, result);
                }

                return result;
            }
        }

        IEnumerable<EmitPropertyInfo> CreateEmitProperties(Type type)
        {
            var properties = type
                .GetProperties(BindingFlags.Public | BindingFlags.Instance)
                .Where(v =>
                    (v.GetGetMethod() == null || v.GetGetMethod().GetParameters().Length == 0) &&
                    (v.GetSetMethod() == null || v.GetSetMethod().GetParameters().Length == 1)
                );

            foreach (var property in properties)
                yield return new EmitPropertyInfo(
                    property,
                    CreatePropertyGet(property),
                    CreatePropertySet(property)
                );
        }

        Func<object, object> CreatePropertyGet(PropertyInfo pi)
        {
            var getMethod = pi.GetGetMethod();

            if (getMethod == null)
                return src =>
                {
                    throw new InvalidOperationException(
                        string.Format(
                            "Getter for property {0}.{1} not found",
                            pi.DeclaringType.FullName,
                            pi.Name
                        )
                    );
                };

            var method = new DynamicMethod(GetDynamicMethodName(pi, "Get"), typeof(object), new[] { typeof(object) }, pi.Module);
            var il = method.GetILGenerator();

            il.Emit(OpCodes.Ldarg_0);
            if (pi.DeclaringType.IsValueType)
                il.Emit(OpCodes.Unbox, pi.DeclaringType);
            else
                il.Emit(OpCodes.Castclass, pi.DeclaringType);

            il.EmitCall(OpCodes.Callvirt, getMethod, null);

            if (pi.PropertyType.IsValueType)
                il.Emit(OpCodes.Box, pi.PropertyType);

            il.Emit(OpCodes.Ret);

            return (Func<object, object>)method.CreateDelegate(typeof(Func<object, object>));
        }

        Action<object, object> CreatePropertySet(PropertyInfo pi)
        {
            var setMethod = pi.GetSetMethod();

            if (setMethod == null)
                return (src, value) =>
                {
                    throw new InvalidOperationException(
                        string.Format(
                            "Setter for property {0}.{1} not found",
                            pi.DeclaringType.FullName,
                            pi.Name
                        )
                    );
                };

            var method = new DynamicMethod(
                 GetDynamicMethodName(pi, "Set"),
                 typeof(void),
                 new[] { typeof(object), typeof(object) },
                 pi.Module
             );

            var il = method.GetILGenerator();

            il.Emit(OpCodes.Ldarg_0);
            if (pi.DeclaringType.IsValueType)
                il.Emit(OpCodes.Unbox, pi.DeclaringType);
            else
                il.Emit(OpCodes.Castclass, pi.DeclaringType);

            il.Emit(OpCodes.Ldarg_1);
            il.Emit(OpCodes.Unbox_Any, pi.PropertyType);

            il.EmitCall(OpCodes.Callvirt, setMethod, null);

            il.Emit(OpCodes.Ret);

            return (Action<object, object>)method.CreateDelegate(typeof(Action<object, object>));
        }

        string GetDynamicMethodName(PropertyInfo pi, string suffix)
        {
            return string.Join("/", typeof(EmitTypeInfo).FullName, pi.DeclaringType.FullName, pi.Name, suffix);
        }
    }

    public class EmitPropertyInfo
    {
        public PropertyInfo Property { get; private set; }
        public Func<object, object> GetValue { get; private set; }
        public Action<object, object> SetValue { get; private set; }

        public EmitPropertyInfo(PropertyInfo property, Func<object, object> getValue, Action<object, object> setValue)
        {
            Property = property;
            GetValue = getValue;
            SetValue = setValue;
        }
    }
}



Итого, если так важный эти эмитовские копейки, допиливаем. Мне и на классической рефлексии хорошо живется :)
...
Рейтинг: 0 / 0
IndexOutOfRangeException: Объясните дураку КАК такое вообще может быть?
    #38226323
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степиcooldeveloper,
в том то и дело, никаких словарей я не увидел или на что то похожее типа этого
Код: c#
1.
2.
3.
4.
  static  class  PropertyInfoCashe<T> 
    {
       static  Lazy<List<PropertyInfo>> listPi=new Lazy<List<PropertyInfo>>(() => typeof (T).GetProperties().ToList());
    }


А пардон, посыпаю голову пеплом, скачал исходники - более понятно чем рефлектор.
реализации Автомаппера идет через Emit кешируется делегат под получаемый тип.
все вроде ок..
...
Рейтинг: 0 / 0
IndexOutOfRangeException: Объясните дураку КАК такое вообще может быть?
    #38226328
cooldeveloper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степиболее понятно чем рефлектор
Ты рефлектором смотрел код?
...
Рейтинг: 0 / 0
IndexOutOfRangeException: Объясните дураку КАК такое вообще может быть?
    #38226382
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cooldeveloper,
ну а чо, решил быстро пробежаться ))
...
Рейтинг: 0 / 0
10 сообщений из 35, страница 2 из 2
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / IndexOutOfRangeException: Объясните дураку КАК такое вообще может быть?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]