return true;
}
+ public static bool HasPositionalParameters (this XamlType type)
+ {
+ // FIXME: find out why only TypeExtension and StaticExtension yield this directive. Seealso XamlObjectReaderTest.Read_CustomMarkupExtension*()
+ return type == XamlLanguage.Type ||
+ type == XamlLanguage.Static ||
+ ExaminePositionalParametersApplicable (type) && type.ConstructionRequiresArguments;
+ }
+
+ static bool ExaminePositionalParametersApplicable (this XamlType type)
+ {
+ if (!type.IsMarkupExtension || type.UnderlyingType == null)
+ return false;
+
+ var args = type.GetSortedConstructorArguments ();
+ if (args == null)
+ return false;
+
+ foreach (var arg in args)
+ if (arg.Type != null && !arg.Type.IsContentValue () && arg.Type.TypeConverter == null)
+ return false;
+
+ Type [] argTypes = (from arg in args select arg.Type.UnderlyingType).ToArray ();
+ if (argTypes.Any (at => at == null))
+ return false;
+ var ci = type.UnderlyingType.GetConstructor (argTypes);
+ return ci != null;
+ }
+
public static IEnumerable<XamlMember> GetConstructorArguments (this XamlType type)
{
return type.GetAllMembers ().Where (m => m.UnderlyingMember != null && m.GetCustomAttributeProvider ().GetCustomAttribute<ConstructorArgumentAttribute> (false) != null);
internal static class TypeExtensionMethods2
{
- static bool ExaminePositionalParametersApplicable (this XamlType type)
- {
- if (!type.IsMarkupExtension || type.UnderlyingType == null)
- return false;
-
- var args = type.GetSortedConstructorArguments ();
- if (args == null)
- return false;
-
- foreach (var arg in args)
- if (arg.Type != null && !arg.Type.IsContentValue () && arg.Type.TypeConverter == null)
- return false;
-
- Type [] argTypes = (from arg in args select arg.Type.UnderlyingType).ToArray ();
- if (argTypes.Any (at => at == null))
- return false;
- var ci = type.UnderlyingType.GetConstructor (argTypes);
- return ci != null;
- }
-
// Note that this returns XamlMember which might not actually appear in XamlObjectReader. For example, XamlLanguage.Items won't be returned when there is no item in the collection.
public static IEnumerable<XamlMember> GetAllObjectReaderMembersByType (this XamlType type, object dictionaryKey)
{
- // FIXME: find out why only TypeExtension and StaticExtension yield this directive. Seealso XamlObjectReaderTest.Read_CustomMarkupExtension*()
- if (type == XamlLanguage.Type ||
- type == XamlLanguage.Static ||
- ExaminePositionalParametersApplicable (type) && type.ConstructionRequiresArguments) {
+ if (type.HasPositionalParameters ()) {
yield return XamlLanguage.PositionalParameters;
yield break;
}
// state
XamlWriteState state = XamlWriteState.Initial;
bool ns_pushed;
+ bool accept_multiple_values; // It is PositionalParameters-specific state.
public bool HasNamespaces {
get { return ns_pushed; }
}
+
+ // FIXME: actually this property is a hack. It should preserve stacked flag values for each nested member in current tree state.
+ public bool AcceptMultipleValues {
+ get { return accept_multiple_values; }
+ set { accept_multiple_values = value; }
+ }
public void OnClosingItem ()
{
case XamlWriteState.ValueWritten:
switch (next) {
case XamlNodeType.Value:
- if (allow_parallel_values)
+ if (allow_parallel_values | accept_multiple_values)
return;
break;
case XamlNodeType.StartObject:
}
[Test]
+ // This behavior is different from XamlXmlWriter. Compare to XamlXmlWriterTest.WriteValueList().
public void WriteValueList ()
{
var xw = new XamlObjectWriter (sctx, null);