Reflection private поле
От: Ellin Россия www.rsdn.ru
Дата: 14.07.10 09:03
Оценка:
.NET 1.1
Выяснил что для изменения значений в AppConfig можно установить лишь одно поле _isReadOnly. Но код:

Type myType = System.Configuration.ConfigurationSettings.AppSettings.GetType();
myType.GetFields();


Возвращает ноль полей!
AppSettings имеет тип:

internal class ReadOnlyNameValueCollection : NameValueCollection
{
    // Methods
    public ReadOnlyNameValueCollection(ReadOnlyNameValueCollection value);
    public ReadOnlyNameValueCollection(IHashCodeProvider hcp, IComparer comp);
    public void SetReadOnly();
}


[Serializable]
public class NameValueCollection : NameObjectCollectionBase
{
    // Fields
    private string[] _all;
    private string[] _allKeys;

    // Methods
    public NameValueCollection();
    public NameValueCollection(NameValueCollection col);
    public NameValueCollection(int capacity);
    public NameValueCollection(IHashCodeProvider hashProvider, IComparer comparer);
    public NameValueCollection(int capacity, NameValueCollection col);
    protected NameValueCollection(SerializationInfo info, StreamingContext context);
    public NameValueCollection(int capacity, IHashCodeProvider hashProvider, IComparer comparer);
    public void Add(NameValueCollection c);
    public virtual void Add(string name, string value);
    public void Clear();
    public void CopyTo(Array dest, int index);
    public virtual string Get(int index);
    public virtual string Get(string name);
    private static string GetAsOneString(ArrayList list);
    private static string[] GetAsStringArray(ArrayList list);
    public virtual string GetKey(int index);
    public virtual string[] GetValues(int index);
    public virtual string[] GetValues(string name);
    public bool HasKeys();
    internal virtual void InternalClear();
    internal virtual bool InternalHasKeys();
    protected void InvalidateCachedArrays();
    public virtual void Remove(string name);
    public virtual void Set(string name, string value);

    // Properties
    public virtual string[] AllKeys { get; }
    public string this[string name] { get; set; }
    public string this[int index] { get; }
}



[Serializable]
public abstract class NameObjectCollectionBase : ICollection, IEnumerable, ISerializable, IDeserializationCallback
{
    // Fields
    private IComparer _comparer;
    private ArrayList _entriesArray;
    private Hashtable _entriesTable;
    private IHashCodeProvider _hashProvider;
    private KeysCollection _keys;
    private NameObjectEntry _nullKeyEntry;
 private bool _readOnly;
    private SerializationInfo _serializationInfo;
    private int _version;

    // Methods
    protected NameObjectCollectionBase();
    protected NameObjectCollectionBase(int capacity);
    protected NameObjectCollectionBase(IHashCodeProvider hashProvider, IComparer comparer);
    protected NameObjectCollectionBase(SerializationInfo info, StreamingContext context);
    protected NameObjectCollectionBase(int capacity, IHashCodeProvider hashProvider, IComparer comparer);
    protected void BaseAdd(string name, object value);
    protected void BaseClear();
    protected object BaseGet(int index);
...
Re: Reflection private поле
От: hardcase Пират http://nemerle.org
Дата: 14.07.10 09:11
Оценка:
Здравствуйте, Ellin, Вы писали:

E>.NET 1.1

E>Выяснил что для изменения значений в AppConfig можно установить лишь одно поле _isReadOnly. Но код:

E>
E>Type myType = System.Configuration.ConfigurationSettings.AppSettings.GetType();
E>myType.GetFields();
E>


E>Возвращает ноль полей!


Укажите BindingFlags.Instance | BindingFlags.NonPublic, по-умолчанию GetFields() возвращает только публичные поля.
http://nemerle.org/Banners/?t=Developer!&g=dark /* иЗвиНите зА неРовнЫй поЧерК */
Re[2]: Reflection private поле
От: Ellin Россия www.rsdn.ru
Дата: 14.07.10 09:15
Оценка:
Здравствуйте, hardcase, Вы писали:

E>>Возвращает ноль полей!

H>Укажите BindingFlags.Instance | BindingFlags.NonPublic, по-умолчанию GetFields() возвращает только публичные поля.

Почемуто не возвращает

using System;
using System.Reflection;
using System.Collections.Specialized;
using System.Configuration;

namespace ConsoleApplication7
{
    /// <summary>
    /// Summary description for Class1.
    /// </summary>
    class Class1
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main(string[] args)
        {
            Type myType = System.Configuration.ConfigurationSettings.AppSettings.GetType();
            foreach(FieldInfo myFieldInfo in myType.GetFields(BindingFlags.Instance | BindingFlags.NonPublic))
            {
                Console.WriteLine("ыва");
            }
Re[3]: Reflection private поле
От: Пельмешко Россия blog
Дата: 14.07.10 10:02
Оценка:
Здравствуйте, Ellin, Вы писали:

E>Здравствуйте, hardcase, Вы писали:


E>>>Возвращает ноль полей!

H>>Укажите BindingFlags.Instance | BindingFlags.NonPublic, по-умолчанию GetFields() возвращает только публичные поля.

E>Почемуто не возвращает


BindingFlags.FlattenHierarchy попробуйте, наверяка вы в Type наследника поля ищете...
Re[4]: Reflection private поле
От: Ellin Россия www.rsdn.ru
Дата: 14.07.10 10:04
Оценка:
Нет... не получается...
Re[5]: Reflection private поле
От: hardcase Пират http://nemerle.org
Дата: 14.07.10 10:40
Оценка: 3 (1)
Здравствуйте, Ellin, Вы писали:

E>Нет... не получается...


Попробуйте получать поле другим способом, через typeof(NameObjectCollectionBase) (.NET 2.0, тут _readOnly поле зовется)
Type t = typeof(NameObjectCollectionBase);
FieldInfo info = t.GetField("_readOnly", BindingFlags.Instance %| BindingFlags.NonPublic);
Console.WriteLine(info);
http://nemerle.org/Banners/?t=Developer!&g=dark /* иЗвиНите зА неРовнЫй поЧерК */
Re[4]: Reflection private поле
От: hardcase Пират http://nemerle.org
Дата: 14.07.10 10:41
Оценка: 16 (1)
Здравствуйте, Пельмешко, Вы писали:

П>BindingFlags.FlattenHierarchy попробуйте, наверяка вы в Type наследника поля ищете...


FlattenHierarchy нужен для доступа к статическим членам.
http://nemerle.org/Banners/?t=Developer!&g=dark /* иЗвиНите зА неРовнЫй поЧерК */
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.