Code:
/ 4.0 / 4.0 / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / fx / src / DLinq / Dlinq / SqlClient / Common / InheritanceRules.cs / 1305376 / InheritanceRules.cs
using System;
using System.Collections;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq.Expressions;
using System.Reflection;
using System.Text;
using System.Linq;
using System.Data.Linq.Mapping;
using System.Data.Linq.Provider;
namespace System.Data.Linq.SqlClient {
///
/// This class defines the rules for inheritance behaviors. The rules:
///
/// (1) The same field may not be mapped to different database columns.
/// The DistinguishedMemberName and AreSameMember methods describe what 'same' means between two MemberInfos.
/// (2) Discriminators held in fixed-length fields in the database don't need
/// to be manually padded in inheritance mapping [InheritanceMapping(Code='x')].
///
///
static class InheritanceRules {
///
/// Creates a name that is the same when the member should be considered 'same'
/// for the purposes of the inheritance feature.
///
internal static object DistinguishedMemberName(MemberInfo mi) {
PropertyInfo pi = mi as PropertyInfo;
FieldInfo fi = mi as FieldInfo;
if (fi != null) {
// Human readable variant:
// return "fi:" + mi.Name + ":" + mi.DeclaringType;
return new MetaPosition(mi);
}
else if (pi != null) {
MethodInfo meth = null;
if (pi.CanRead) {
meth = pi.GetGetMethod();
}
if (meth == null && pi.CanWrite) {
meth = pi.GetSetMethod();
}
bool isVirtual = meth != null && meth.IsVirtual;
// Human readable variant:
// return "pi:" + mi.Name + ":" + (isVirtual ? "virtual" : mi.DeclaringType.ToString());
if (isVirtual) {
return mi.Name;
} else {
return new MetaPosition(mi);
}
}
else {
throw Error.ArgumentOutOfRange("mi");
}
}
///
/// Compares two MemberInfos for 'same-ness'.
///
internal static bool AreSameMember(MemberInfo mi1, MemberInfo mi2) {
return DistinguishedMemberName(mi1).Equals(DistinguishedMemberName(mi2));
}
///
/// The representation of a inheritance code when mapped to a specific provider type.
///
internal static object InheritanceCodeForClientCompare(object rawCode, System.Data.Linq.SqlClient.ProviderType providerType) {
// If its a fixed-size string type in the store then pad it with spaces so that
// comparing the string on the client agrees with the value returnd on the store.
if (providerType.IsFixedSize && rawCode.GetType()==typeof(string)) {
string s = (string) rawCode;
if (providerType.Size.HasValue && s.Length!=providerType.Size) {
s = s.PadRight(providerType.Size.Value).Substring(0,providerType.Size.Value);
}
return s;
}
return rawCode;
}
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
// Copyright (c) Microsoft Corporation. All rights reserved.
using System;
using System.Collections;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq.Expressions;
using System.Reflection;
using System.Text;
using System.Linq;
using System.Data.Linq.Mapping;
using System.Data.Linq.Provider;
namespace System.Data.Linq.SqlClient {
///
/// This class defines the rules for inheritance behaviors. The rules:
///
/// (1) The same field may not be mapped to different database columns.
/// The DistinguishedMemberName and AreSameMember methods describe what 'same' means between two MemberInfos.
/// (2) Discriminators held in fixed-length fields in the database don't need
/// to be manually padded in inheritance mapping [InheritanceMapping(Code='x')].
///
///
static class InheritanceRules {
///
/// Creates a name that is the same when the member should be considered 'same'
/// for the purposes of the inheritance feature.
///
internal static object DistinguishedMemberName(MemberInfo mi) {
PropertyInfo pi = mi as PropertyInfo;
FieldInfo fi = mi as FieldInfo;
if (fi != null) {
// Human readable variant:
// return "fi:" + mi.Name + ":" + mi.DeclaringType;
return new MetaPosition(mi);
}
else if (pi != null) {
MethodInfo meth = null;
if (pi.CanRead) {
meth = pi.GetGetMethod();
}
if (meth == null && pi.CanWrite) {
meth = pi.GetSetMethod();
}
bool isVirtual = meth != null && meth.IsVirtual;
// Human readable variant:
// return "pi:" + mi.Name + ":" + (isVirtual ? "virtual" : mi.DeclaringType.ToString());
if (isVirtual) {
return mi.Name;
} else {
return new MetaPosition(mi);
}
}
else {
throw Error.ArgumentOutOfRange("mi");
}
}
///
/// Compares two MemberInfos for 'same-ness'.
///
internal static bool AreSameMember(MemberInfo mi1, MemberInfo mi2) {
return DistinguishedMemberName(mi1).Equals(DistinguishedMemberName(mi2));
}
///
/// The representation of a inheritance code when mapped to a specific provider type.
///
internal static object InheritanceCodeForClientCompare(object rawCode, System.Data.Linq.SqlClient.ProviderType providerType) {
// If its a fixed-size string type in the store then pad it with spaces so that
// comparing the string on the client agrees with the value returnd on the store.
if (providerType.IsFixedSize && rawCode.GetType()==typeof(string)) {
string s = (string) rawCode;
if (providerType.Size.HasValue && s.Length!=providerType.Size) {
s = s.PadRight(providerType.Size.Value).Substring(0,providerType.Size.Value);
}
return s;
}
return rawCode;
}
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
// Copyright (c) Microsoft Corporation. All rights reserved.
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- Button.cs
- GeometryDrawing.cs
- SoapElementAttribute.cs
- OleDbError.cs
- RedistVersionInfo.cs
- EmbeddedMailObjectsCollection.cs
- DataQuery.cs
- LinkedResource.cs
- Color.cs
- autovalidator.cs
- TreeWalker.cs
- DoubleAnimationUsingPath.cs
- TdsRecordBufferSetter.cs
- CssClassPropertyAttribute.cs
- FillRuleValidation.cs
- SystemIPv4InterfaceProperties.cs
- Point3DCollectionConverter.cs
- ClientData.cs
- DataAdapter.cs
- PropertyInfo.cs
- MetricEntry.cs
- EnvironmentPermission.cs
- ConstructorBuilder.cs
- HwndStylusInputProvider.cs
- RoleManagerModule.cs
- ServiceKnownTypeAttribute.cs
- DataGridBoundColumn.cs
- RegistryDataKey.cs
- EntityContainerAssociationSetEnd.cs
- MsmqIntegrationSecurity.cs
- followingquery.cs
- NavigationFailedEventArgs.cs
- FontWeightConverter.cs
- FieldBuilder.cs
- PageAsyncTaskManager.cs
- AnonymousIdentificationModule.cs
- TypeDelegator.cs
- DataControlPagerLinkButton.cs
- CellQuery.cs
- SHA256Managed.cs
- metrodevice.cs
- ThousandthOfEmRealPoints.cs
- CodeMethodReturnStatement.cs
- PlatformCulture.cs
- WasEndpointConfigContainer.cs
- WpfXamlType.cs
- CapabilitiesPattern.cs
- CompilationUtil.cs
- HttpServerUtilityWrapper.cs
- CodeStatementCollection.cs
- InfiniteTimeSpanConverter.cs
- FileDialog.cs
- PartialClassGenerationTask.cs
- InternalEnumValidatorAttribute.cs
- CodeGeneratorOptions.cs
- ListViewEditEventArgs.cs
- GridViewHeaderRowPresenterAutomationPeer.cs
- AuthenticationSection.cs
- CqlBlock.cs
- LogLogRecord.cs
- TreeNodeBindingDepthConverter.cs
- SocketConnection.cs
- unitconverter.cs
- ViewKeyConstraint.cs
- StringValidatorAttribute.cs
- PriorityQueue.cs
- SignerInfo.cs
- PropertySourceInfo.cs
- SharedDp.cs
- WindowsAltTab.cs
- ToolboxItemFilterAttribute.cs
- InvokeMethod.cs
- XmlILOptimizerVisitor.cs
- SimpleType.cs
- QilInvokeEarlyBound.cs
- XmlSchemaComplexContentRestriction.cs
- LinkLabelLinkClickedEvent.cs
- XmlSchemaComplexContentExtension.cs
- StructuralCache.cs
- CellParagraph.cs
- LicenseException.cs
- ObjectViewListener.cs
- RegexRunner.cs
- HttpResponseWrapper.cs
- DefaultPropertyAttribute.cs
- SerializationTrace.cs
- SystemNetHelpers.cs
- AutomationProperties.cs
- UserControl.cs
- XmlDataContract.cs
- HttpCookie.cs
- InheritanceContextHelper.cs
- dsa.cs
- KeyInstance.cs
- EventListenerClientSide.cs
- PathNode.cs
- RegexWorker.cs
- ColumnCollection.cs
- ReadContentAsBinaryHelper.cs
- CustomCredentialPolicy.cs