Здравствуйте, Ellin, Вы писали:
E>Нет... не получается...
Попробуйте получать поле другим способом, через typeof(NameObjectCollectionBase) (.NET 2.0, тут _readOnly поле зовется)
Type t = typeof(NameObjectCollectionBase);
FieldInfo info = t.GetField("_readOnly", BindingFlags.Instance %| BindingFlags.NonPublic);
Console.WriteLine(info);
.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);
...
Здравствуйте, 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() возвращает только публичные поля.
Здравствуйте, 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("ыва");
}
Здравствуйте, Ellin, Вы писали:
E>Здравствуйте, hardcase, Вы писали:
E>>>Возвращает ноль полей!
H>>Укажите BindingFlags.Instance | BindingFlags.NonPublic, по-умолчанию GetFields() возвращает только публичные поля.
E>Почемуто не возвращает
BindingFlags.FlattenHierarchy попробуйте, наверяка вы в Type наследника поля ищете...