本文整理汇总了C#中DynamicMetaObject.Clone方法的典型用法代码示例。如果您正苦于以下问题:C# DynamicMetaObject.Clone方法的具体用法?C# DynamicMetaObject.Clone怎么用?C# DynamicMetaObject.Clone使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类DynamicMetaObject
的用法示例。
在下文中一共展示了DynamicMetaObject.Clone方法的3个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C#代码示例。
示例1: MakeUnindexableError
private static DynamicMetaObject MakeUnindexableError(DynamicMetaObjectBinder operation, PythonIndexType op, DynamicMetaObject/*!*/[] types, DynamicMetaObject indexedType, PythonContext state) {
DynamicMetaObject[] newTypes = (DynamicMetaObject[])types.Clone();
newTypes[0] = indexedType;
PythonTypeSlot dummySlot;
if (op != PythonIndexType.GetItem &&
op != PythonIndexType.GetSlice &&
DynamicHelpers.GetPythonType(indexedType.Value).TryResolveSlot(state.SharedContext, "__getitem__", out dummySlot)) {
// object supports indexing but not setting/deletion
if (op == PythonIndexType.SetItem || op == PythonIndexType.SetSlice) {
return TypeError(operation, "'{0}' object does not support item assignment", newTypes);
} else {
return TypeError(operation, "'{0}' object doesn't support item deletion", newTypes);
}
}
return TypeError(operation, "'{0}' object is unsubscriptable", newTypes);
}
示例2: GetGetOrDeleteSlice
private static DynamicMetaObject/*!*/ GetGetOrDeleteSlice(PythonContext state, DynamicMetaObject/*!*/[]/*!*/ args) {
DynamicMetaObject[] newArgs = (DynamicMetaObject[])args.Clone();
for (int i = 1; i < newArgs.Length; i++) {
if (!IsIndexType(state, newArgs[i])) {
newArgs[i] = newArgs[i].Restrict(newArgs[i].GetLimitType());
}
}
return new DynamicMetaObject(
Ast.Call(
typeof(PythonOps).GetMethod("MakeSlice"),
AstUtils.Convert(GetGetOrDeleteParameter(newArgs, 1), typeof(object)),
AstUtils.Convert(GetGetOrDeleteParameter(newArgs, 2), typeof(object)),
AstUtils.Convert(GetGetOrDeleteParameter(newArgs, 3), typeof(object))
),
BindingRestrictions.Combine(newArgs)
);
}
示例3: MakeIndexerOperation
/// <summary>
/// Python has three protocols for slicing:
/// Simple Slicing x[i:j]
/// Extended slicing x[i,j,k,...]
/// Long Slice x[start:stop:step]
///
/// The first maps to __*slice__ (get, set, and del).
/// This takes indexes - i, j - which specify the range of elements to be
/// returned. In the slice variants both i, j must be numeric data types.
/// The 2nd and 3rd are both __*item__.
/// This receives a single index which is either a Tuple or a Slice object (which
/// encapsulates the start, stop, and step values)
///
/// This is in addition to a simple indexing x[y].
///
/// For simple slicing and long slicing Python generates Operators.*Slice. For
/// the extended slicing and simple indexing Python generates a Operators.*Item
/// action.
///
/// Extended slicing maps to the normal .NET multi-parameter input.
///
/// So our job here is to first determine if we're to call a __*slice__ method or
/// a __*item__ method.
/// </summary>
private static DynamicMetaObject/*!*/ MakeIndexerOperation(DynamicMetaObjectBinder/*!*/ operation, PythonIndexType op, DynamicMetaObject/*!*/[]/*!*/ types, DynamicMetaObject errorSuggestion) {
string item, slice;
DynamicMetaObject indexedType = types[0].Restrict(types[0].GetLimitType());
PythonContext state = PythonContext.GetPythonContext(operation);
BuiltinFunction itemFunc = null;
PythonTypeSlot itemSlot = null;
bool callSlice = false;
int mandatoryArgs;
GetIndexOperators(op, out item, out slice, out mandatoryArgs);
if (types.Length == mandatoryArgs + 1 && IsSlice(op) && HasOnlyNumericTypes(operation, types, op == PythonIndexType.SetSlice)) {
// two slice indexes, all int arguments, need to call __*slice__ if it exists
callSlice = BindingHelpers.TryGetStaticFunction(state, slice, indexedType, out itemFunc);
if (itemFunc == null || !callSlice) {
callSlice = MetaPythonObject.GetPythonType(indexedType).TryResolveSlot(state.SharedContext, slice, out itemSlot);
}
}
if (!callSlice) {
// 1 slice index (simple index) or multiple slice indexes or no __*slice__, call __*item__,
if (!BindingHelpers.TryGetStaticFunction(state, item, indexedType, out itemFunc)) {
MetaPythonObject.GetPythonType(indexedType).TryResolveSlot(state.SharedContext, item, out itemSlot);
}
}
// make the Callable object which does the actual call to the function or slot
Callable callable = Callable.MakeCallable(state, op, itemFunc, itemSlot);
if (callable == null) {
return errorSuggestion ?? MakeUnindexableError(operation, op, types, indexedType, state);
}
// prepare the arguments and make the builder which will
// call __*slice__ or __*item__
DynamicMetaObject[] args;
IndexBuilder builder;
if (callSlice) {
// we're going to call a __*slice__ method, we pass the args as is.
Debug.Assert(IsSlice(op));
builder = new SliceBuilder(types, callable);
// slicing is dependent upon the types of the arguments (HasNumericTypes)
// so we must restrict them.
args = ConvertArgs(types);
} else {
// we're going to call a __*item__ method.
builder = new ItemBuilder(types, callable);
if (IsSlice(op)) {
// we need to create a new Slice object.
args = GetItemSliceArguments(state, op, types);
} else {
// no need to restrict the arguments. We're not
// a slice and so restrictions are not necessary
// here because it's not dependent upon our types.
args = (DynamicMetaObject[])types.Clone();
// but we do need to restrict based upon the type
// of object we're calling on.
args[0] = types[0].Restrict(types[0].GetLimitType());
}
}
return builder.MakeRule(operation, state, args);
}