/// <summary> /// Load string content /// </summary> /// <param name="content"></param> /// <param name="separator"></param> /// <returns></returns> public bool Load(string content, char separator = ',') { //Dispose records ClearRecord(); if (string.IsNullOrEmpty(content)) { ZDebug.LogError(string.Format("CSV file content empty!")); return(false); } bool check = CheckLegal(content, separator); if (!check) { return(false); } Separator = separator; _records = new List <List <string> >(); foreach (string row in content.Split('\r').Where(line => !string.IsNullOrEmpty(line.Trim()))) { List <string> columns = row.Split(separator).Select(s => s.Trim()).ToList(); //Check each row's column count. They must match if (ColumnCount != 0 && columns.Count != ColumnCount) { ZDebug.LogError( string.Format("CSV parsing error at line {0} : columns counts do not match! Separator: '{1}'", content.IndexOf(row), separator)); return(false); } ColumnCount = columns.Count; _records.Add(columns); } RowCount = _records.Count; if (_records == null || !_records.Any()) { ZDebug.LogWarning(string.Format("CSV file parsing failed(empty records)!")); return(false); } return(true); }
public void Register <T>(T bindable) where T : class { if (Attribute.IsDefined(bindable.GetType(), typeof(ViewModelAttribute))) { if (!_viewModels.TryAdd(bindable.GetType(), bindable)) { ZDebug.LogError(string.Format("Register mvvm binding failed. type: {0}, object: {1}", bindable.GetType(), bindable)); } } if (Attribute.IsDefined(bindable.GetType(), typeof(ViewAttribute))) { if (!_views.SafeAdd(bindable)) { ZDebug.LogError(string.Format("Register mvvm binding failed. type: {0}, object: {1}", bindable.GetType(), bindable)); } } _groups.Clear(); foreach (object view in _views) { Type viewModelType = ((ViewAttribute)Attribute.GetCustomAttribute(view.GetType(), typeof(ViewAttribute))) .SourceType; if (viewModelType == null) { ZDebug.LogError(string.Format("View class has no viewModel class! view type: {0}", view.GetType())); continue; } object viewModel = _viewModels.TryGet(viewModelType); if (viewModel == null) { ZDebug.LogWarning( string.Format( "It may happend when view has been registered but view model has not yet. View: {0}, ViewModel: {1}", view, viewModelType)); continue; } foreach ( MemberInfo member in view.GetType().GetMembers().Where(p => Attribute.IsDefined(p, typeof(BindingMemberAttribute)))) { BindingGroup group = new BindingGroup(); group.ViewMember = member; group.View = view; group.ViewModel = viewModel; string bindingKey = ((BindingMemberAttribute)Attribute.GetCustomAttribute(member, typeof(BindingMemberAttribute))) .BindingKey; switch (member.MemberType) { case MemberTypes.Event: { Delegate del = Delegate.CreateDelegate(((EventInfo)member).EventHandlerType, viewModel, bindingKey, false, false); if (del == null) { ZDebug.LogError(string.Format("Binding method to event failed! event: {0}, methodName: {1}", member, bindingKey)); } else { ((EventInfo)member).AddEventHandler(view, del); } } break; case MemberTypes.Field: break; case MemberTypes.Method: { MethodInfo method = viewModelType.GetMethod(bindingKey); if (method.ReturnType == ((MethodInfo)member).ReturnType) { if (method.GetParameters().Length == ((MethodInfo)member).GetParameters().Length) { bool ok = true; for (int i = 0; i < method.GetParameters().Length; i++) { if (method.GetParameters()[i].ParameterType != ((MethodInfo)member).GetParameters()[i].ParameterType) { ok = false; } } if (ok) { group.ViewModelMember = method; break; } } } ZDebug.LogError(string.Format("View method does not match view model method! {0}, {1}", member, method)); } break; case MemberTypes.Property: { if (!((PropertyInfo)member).CanRead || !((PropertyInfo)member).CanWrite) { ZDebug.LogError(string.Format("View property is not accessable! {2} Read: {0}, Write: {1}", ((PropertyInfo)member).CanRead, ((PropertyInfo)member).CanWrite, member)); break; } PropertyInfo prop = viewModelType.GetProperty(bindingKey); if (!prop.CanRead || !prop.CanWrite) { ZDebug.LogError(string.Format("View model property is not accessable! {2} Read: {0}, Write: {1}", prop.CanRead, prop.CanWrite, prop)); break; } if (((PropertyInfo)member).PropertyType != prop.PropertyType) { ZDebug.LogError(string.Format("View property does not match view model property! {0}, {1}", member, prop)); break; } group.ViewModelMember = prop; } break; default: ZDebug.LogError("Member type not surported for binding! type: " + member.MemberType); break; } if (group.CanUpdate) { _groups.Add(group); } } } foreach (object viewModel in _viewModels.Values) { if (viewModel is INotifyPropertyChanged) { ((INotifyPropertyChanged)viewModel).PropertyChanged += (sender, args) => Notify(sender, args.PropertyName); } } }