From 2941023adffa6273d2566e074e16b2205e038ec1 Mon Sep 17 00:00:00 2001 From: zhoujinyu <2319109590@qq.com> Date: Thu, 25 Sep 2025 00:52:54 +0800 Subject: [PATCH 1/2] feat: extend policy size limit from 12 to 14 parameters --- .../Examples/support_count_model.conf | 12 +- .../GenericTests/SupportCountTest.cs | 18 +- Casbin/Abstractions/Persist/IPersistPolicy.cs | 2 + .../Persist/IReadOnlyPersistPolicy.cs | 2 + Casbin/Enforcer.Internal.cs | 4 + .../EnforcerExtension.GenericEnforce.cs | 236 ++++++++++++++++ Casbin/Model/Policy.cs | 70 ++++- Casbin/Model/PolicyValues.cs | 64 ++++- Casbin/Model/Request.cs | 12 +- Casbin/Model/RequestValues.cs | 255 +++++++++++++++++- Casbin/Persist/PersistantPolicy.cs | 35 ++- Casbin/Persist/PolicyFilter.cs | 26 +- 12 files changed, 706 insertions(+), 30 deletions(-) diff --git a/Casbin.UnitTests/Examples/support_count_model.conf b/Casbin.UnitTests/Examples/support_count_model.conf index eadce52..d4ee9ea 100644 --- a/Casbin.UnitTests/Examples/support_count_model.conf +++ b/Casbin.UnitTests/Examples/support_count_model.conf @@ -11,8 +11,10 @@ r9 = value1, value2, value3, value4, value5, value6, value7, value8, value9 r10= value1, value2, value3, value4, value5, value6, value7, value8, value9, valueA r11= value1, value2, value3, value4, value5, value6, value7, value8, value9, valueA, valueB r12= value1, value2, value3, value4, value5, value6, value7, value8, value9, valueA, valueB, valueC -# Not support generic r13= value1, value2, value3, value4, value5, value6, value7, value8, value9, valueA, valueB, valueC, valueD +r14= value1, value2, value3, value4, value5, value6, value7, value8, value9, valueA, valueB, valueC, valueD, valueE +# Not support generic +r15= value1, value2, value3, value4, value5, value6, value7, value8, value9, valueA, valueB, valueC, valueD, valueE, valueF [policy_definition] p = value1 @@ -27,8 +29,10 @@ p9 = value1, value2, value3, value4, value5, value6, value7, value8, value9 p10= value1, value2, value3, value4, value5, value6, value7, value8, value9, valueA p11= value1, value2, value3, value4, value5, value6, value7, value8, value9, valueA, valueB p12= value1, value2, value3, value4, value5, value6, value7, value8, value9, valueA, valueB, valueC -# Not support generic p13= value1, value2, value3, value4, value5, value6, value7, value8, value9, valueA, valueB, valueC, valueD +p14= value1, value2, value3, value4, value5, value6, value7, value8, value9, valueA, valueB, valueC, valueD, valueE +# Not support generic +p15= value1, value2, value3, value4, value5, value6, value7, value8, value9, valueA, valueB, valueC, valueD, valueE, valueF [role_definition] g = _, _ @@ -49,5 +53,7 @@ m9 = r9.value1 == p9.value1 && r9.value2 == p9.value2 && r9.value3 == p9.value3 m10= r10.value1 == p10.value1 && r10.value2 == p10.value2 && r10.value3 == p10.value3 && r10.value4 == p10.value4 && r10.value5 == p10.value5 && r10.value6 == p10.value6 && r10.value7 == p10.value7 && r10.value8 == p10.value8 && r10.value9 == p10.value9 && r10.valueA == p10.valueA m11= r11.value1 == p11.value1 && r11.value2 == p11.value2 && r11.value3 == p11.value3 && r11.value4 == p11.value4 && r11.value5 == p11.value5 && r11.value6 == p11.value6 && r11.value7 == p11.value7 && r11.value8 == p11.value8 && r11.value9 == p11.value9 && r11.valueA == p11.valueA && r11.valueB == p11.valueB m12= r12.value1 == p12.value1 && r12.value2 == p12.value2 && r12.value3 == p12.value3 && r12.value4 == p12.value4 && r12.value5 == p12.value5 && r12.value6 == p12.value6 && r12.value7 == p12.value7 && r12.value8 == p12.value8 && r12.value9 == p12.value9 && r12.valueA == p12.valueA && r12.valueB == p12.valueB && r12.valueC == p12.valueC -# Not support generic m13= r13.value1 == p13.value1 && r13.value2 == p13.value2 && r13.value3 == p13.value3 && r13.value4 == p13.value4 && r13.value5 == p13.value5 && r13.value6 == p13.value6 && r13.value7 == p13.value7 && r13.value8 == p13.value8 && r13.value9 == p13.value9 && r13.valueA == p13.valueA && r13.valueB == p13.valueB && r13.valueC == p13.valueC && r13.valueD == p13.valueD +m14= r14.value1 == p14.value1 && r14.value2 == p14.value2 && r14.value3 == p14.value3 && r14.value4 == p14.value4 && r14.value5 == p14.value5 && r14.value6 == p14.value6 && r14.value7 == p14.value7 && r14.value8 == p14.value8 && r14.value9 == p14.value9 && r14.valueA == p14.valueA && r14.valueB == p14.valueB && r14.valueC == p14.valueC && r14.valueD == p14.valueD && r14.valueE == p14.valueE +# Not support generic +m15= r15.value1 == p15.value1 && r15.value2 == p15.value2 && r15.value3 == p15.value3 && r15.value4 == p15.value4 && r15.value5 == p15.value5 && r15.value6 == p15.value6 && r15.value7 == p15.value7 && r15.value8 == p15.value8 && r15.value9 == p15.value9 && r15.valueA == p15.valueA && r15.valueB == p15.valueB && r15.valueC == p15.valueC && r15.valueD == p15.valueD && r15.valueE == p15.valueE && r15.valueF == p15.valueF diff --git a/Casbin.UnitTests/GenericTests/SupportCountTest.cs b/Casbin.UnitTests/GenericTests/SupportCountTest.cs index c21220b..1da7863 100644 --- a/Casbin.UnitTests/GenericTests/SupportCountTest.cs +++ b/Casbin.UnitTests/GenericTests/SupportCountTest.cs @@ -12,7 +12,7 @@ public class SupportCountTest [Fact] public void TestSupportCount() { - for (int i = 1; i <= 13; i++) + for (int i = 1; i <= 14; i++) { IEnforcer enforcer = new Enforcer(DefaultModel.CreateFromText(TestModelFixture.SupportCountModelText)); string policyType = $"p{i}"; @@ -120,6 +120,13 @@ private static void TestEnforce(IEnforcer enforcer, EnforceContext context, int Assert.True(enforcer.Enforce(context, "value1", "value2", "value3", "value4", "value5", "value6", "value7", "value8", "value9", "value10", "value11", "value12", "value13")); break; + case 14: + Assert.True(enforcer.Enforce(context, Request.CreateValues("value1", "value2", "value3", + "value4", "value5", "value6", "value7", "value8", "value9", + "value10", "value11", "value12", "value13", "value14"))); + Assert.True(enforcer.Enforce(context, "value1", "value2", "value3", "value4", "value5", "value6", + "value7", "value8", "value9", "value10", "value11", "value12", "value13", "value14")); + break; default: throw new ArgumentOutOfRangeException(nameof(requestCount)); } @@ -135,4 +142,13 @@ private static IPolicyValues CreateTestPolicy(int count) return Policy.ValuesFrom(policy); } + + [Fact] + public void TestUnsupportedCount() + { + // 测试不支持的情况 - 15个参数应该抛出异常 + // 由于没有15个参数的CreateValues重载,我们需要测试SupportGeneric方法 + Assert.False(Request.SupportGeneric(15)); + Assert.False(Policy.SupportGeneric(15)); + } } diff --git a/Casbin/Abstractions/Persist/IPersistPolicy.cs b/Casbin/Abstractions/Persist/IPersistPolicy.cs index 47f5b66..4276e0b 100644 --- a/Casbin/Abstractions/Persist/IPersistPolicy.cs +++ b/Casbin/Abstractions/Persist/IPersistPolicy.cs @@ -16,6 +16,8 @@ public interface IPersistPolicy public string Value10 { get; set; } public string Value11 { get; set; } public string Value12 { get; set; } + public string Value13 { get; set; } + public string Value14 { get; set; } } diff --git a/Casbin/Abstractions/Persist/IReadOnlyPersistPolicy.cs b/Casbin/Abstractions/Persist/IReadOnlyPersistPolicy.cs index 000558e..c304455 100644 --- a/Casbin/Abstractions/Persist/IReadOnlyPersistPolicy.cs +++ b/Casbin/Abstractions/Persist/IReadOnlyPersistPolicy.cs @@ -16,6 +16,8 @@ public interface IReadOnlyPersistPolicy public string Value10 { get; } public string Value11 { get; } public string Value12 { get; } + public string Value13 { get; } + public string Value14 { get; } } diff --git a/Casbin/Enforcer.Internal.cs b/Casbin/Enforcer.Internal.cs index 5f06f8a..02dad2b 100644 --- a/Casbin/Enforcer.Internal.cs +++ b/Casbin/Enforcer.Internal.cs @@ -58,6 +58,10 @@ private bool InternalEnforce(in EnforceContext context, in TRequest re string, string, string, string>>(in context, requestValues), 12 => InternalEnforce>(in context, requestValues), + 13 => InternalEnforce>(in context, requestValues), + 14 => InternalEnforce>(in context, requestValues), _ => InternalEnforce(in context, requestValues) }; } diff --git a/Casbin/Extensions/Enforcer/EnforcerExtension.GenericEnforce.cs b/Casbin/Extensions/Enforcer/EnforcerExtension.GenericEnforce.cs index 5eed596..50af704 100644 --- a/Casbin/Extensions/Enforcer/EnforcerExtension.GenericEnforce.cs +++ b/Casbin/Extensions/Enforcer/EnforcerExtension.GenericEnforce.cs @@ -1185,4 +1185,240 @@ public static (bool Result, IEnumerable> Explains) } #endregion + + #region Generic Enforce Count 13 + + public static bool Enforce(this IEnforcer enforcer, T1 value1, + T2 value2, T3 value3, T4 value4, T5 value5, T6 value6, T7 value7, T8 value8, T9 value9, T10 value10, + T11 value11, T12 value12, T13 value13) + { + var request = Request.CreateValues(value1, value2, value3, value4, value5, value6, value7, value8, value9, + value10, + value11, value12, value13); + return enforcer.Enforce(enforcer.CreateContext(), request); + } + + public static Task EnforceAsync(this IEnforcer enforcer, + T1 value1, T2 value2, T3 value3, T4 value4, T5 value5, T6 value6, T7 value7, T8 value8, T9 value9, T10 value10, + T11 value11, T12 value12, T13 value13) + { + var request = Request.CreateValues(value1, value2, value3, value4, value5, value6, value7, value8, value9, + value10, + value11, value12, value13); + return enforcer.EnforceAsync(enforcer.CreateContext(), request); + } + + public static bool Enforce(this IEnforcer enforcer, + EnforceContext context, T1 value1, T2 value2, T3 value3, T4 value4, T5 value5, T6 value6, T7 value7, T8 value8, + T9 value9, T10 value10, T11 value11, T12 value12, T13 value13) + { + var request = Request.CreateValues(value1, value2, value3, value4, value5, value6, value7, value8, value9, + value10, + value11, value12, value13); + return enforcer.Enforce(context, request); + } + + public static Task EnforceAsync(this IEnforcer enforcer, + EnforceContext context, T1 value1, T2 value2, T3 value3, T4 value4, T5 value5, T6 value6, T7 value7, T8 value8, + T9 value9, T10 value10, T11 value11, T12 value12, T13 value13) + { + var request = Request.CreateValues(value1, value2, value3, value4, value5, value6, value7, value8, value9, + value10, + value11, value12, value13); + return enforcer.EnforceAsync(context, request); + } + + public static (bool Result, IEnumerable> Explains) + EnforceEx(this IEnforcer enforcer, T1 value1, T2 value2, + T3 value3, T4 value4, T5 value5, T6 value6, T7 value7, T8 value8, T9 value9, T10 value10, T11 value11, + T12 value12, T13 value13) + { + var request = Request.CreateValues(value1, value2, value3, value4, value5, value6, value7, value8, value9, + value10, + value11, value12, value13); + EnforceContext context = enforcer.CreateContext(true); + bool result = enforcer.Enforce(context, request); + return (result, context.Explanations); + } + + public static async Task<(bool Result, IEnumerable> Explains)> + EnforceExAsync(this IEnforcer enforcer, T1 value1, T2 value2, + T3 value3, T4 value4, T5 value5, T6 value6, T7 value7, T8 value8, T9 value9, T10 value10, T11 value11, + T12 value12, T13 value13) + { + var request = Request.CreateValues(value1, value2, value3, value4, value5, value6, value7, value8, value9, + value10, + value11, value12, value13); + EnforceContext context = enforcer.CreateContext(true); + bool result = await enforcer.EnforceAsync(context, request); + return (result, context.Explanations); + } + + public static bool EnforceWithMatcher(this IEnforcer enforcer, + string matcher, T1 value1, T2 value2, T3 value3, T4 value4, T5 value5, T6 value6, T7 value7, T8 value8, + T9 value9, T10 value10, T11 value11, T12 value12, T13 value13) + { + var request = Request.CreateValues(value1, value2, value3, value4, value5, value6, value7, value8, value9, + value10, + value11, value12, value13); + EnforceContext context = enforcer.CreateContextWithMatcher(matcher); + return enforcer.Enforce(context, request); + } + + public static Task EnforceWithMatcherAsync( + this IEnforcer enforcer, string matcher, T1 value1, T2 value2, T3 value3, T4 value4, T5 value5, T6 value6, + T7 value7, T8 value8, T9 value9, T10 value10, T11 value11, T12 value12, T13 value13) + { + var request = Request.CreateValues(value1, value2, value3, value4, value5, value6, value7, value8, value9, + value10, + value11, value12, value13); + EnforceContext context = enforcer.CreateContextWithMatcher(matcher); + return enforcer.EnforceAsync(context, request); + } + + public static (bool Result, IEnumerable> Explains) + EnforceExWithMatcher(this IEnforcer enforcer, string matcher, + T1 value1, T2 value2, T3 value3, T4 value4, T5 value5, T6 value6, T7 value7, T8 value8, T9 value9, + T10 value10, T11 value11, T12 value12, T13 value13) + { + var request = Request.CreateValues(value1, value2, value3, value4, value5, value6, value7, value8, value9, + value10, + value11, value12, value13); + EnforceContext context = enforcer.CreateContextWithMatcher(matcher, true); + bool result = enforcer.Enforce(context, request); + return (result, context.Explanations); + } + + public static async Task<(bool Result, IEnumerable> Explains)> + EnforceExWithMatcherAsync(this IEnforcer enforcer, + string matcher, T1 value1, T2 value2, T3 value3, T4 value4, T5 value5, T6 value6, T7 value7, T8 value8, + T9 value9, T10 value10, T11 value11, T12 value12, T13 value13) + { + var request = Request.CreateValues(value1, value2, value3, value4, value5, value6, value7, value8, value9, + value10, + value11, value12, value13); + EnforceContext context = enforcer.CreateContextWithMatcher(matcher, true); + bool result = await enforcer.EnforceAsync(context, request); + return (result, context.Explanations); + } + + #endregion + + #region Generic Enforce Count 14 + + public static bool Enforce(this IEnforcer enforcer, T1 value1, + T2 value2, T3 value3, T4 value4, T5 value5, T6 value6, T7 value7, T8 value8, T9 value9, T10 value10, + T11 value11, T12 value12, T13 value13, T14 value14) + { + var request = Request.CreateValues(value1, value2, value3, value4, value5, value6, value7, value8, value9, + value10, + value11, value12, value13, value14); + return enforcer.Enforce(enforcer.CreateContext(), request); + } + + public static Task EnforceAsync(this IEnforcer enforcer, + T1 value1, T2 value2, T3 value3, T4 value4, T5 value5, T6 value6, T7 value7, T8 value8, T9 value9, T10 value10, + T11 value11, T12 value12, T13 value13, T14 value14) + { + var request = Request.CreateValues(value1, value2, value3, value4, value5, value6, value7, value8, value9, + value10, + value11, value12, value13, value14); + return enforcer.EnforceAsync(enforcer.CreateContext(), request); + } + + public static bool Enforce(this IEnforcer enforcer, + EnforceContext context, T1 value1, T2 value2, T3 value3, T4 value4, T5 value5, T6 value6, T7 value7, T8 value8, + T9 value9, T10 value10, T11 value11, T12 value12, T13 value13, T14 value14) + { + var request = Request.CreateValues(value1, value2, value3, value4, value5, value6, value7, value8, value9, + value10, + value11, value12, value13, value14); + return enforcer.Enforce(context, request); + } + + public static Task EnforceAsync(this IEnforcer enforcer, + EnforceContext context, T1 value1, T2 value2, T3 value3, T4 value4, T5 value5, T6 value6, T7 value7, T8 value8, + T9 value9, T10 value10, T11 value11, T12 value12, T13 value13, T14 value14) + { + var request = Request.CreateValues(value1, value2, value3, value4, value5, value6, value7, value8, value9, + value10, + value11, value12, value13, value14); + return enforcer.EnforceAsync(context, request); + } + + public static (bool Result, IEnumerable> Explains) + EnforceEx(this IEnforcer enforcer, T1 value1, T2 value2, + T3 value3, T4 value4, T5 value5, T6 value6, T7 value7, T8 value8, T9 value9, T10 value10, T11 value11, + T12 value12, T13 value13, T14 value14) + { + var request = Request.CreateValues(value1, value2, value3, value4, value5, value6, value7, value8, value9, + value10, + value11, value12, value13, value14); + EnforceContext context = enforcer.CreateContext(true); + bool result = enforcer.Enforce(context, request); + return (result, context.Explanations); + } + + public static async Task<(bool Result, IEnumerable> Explains)> + EnforceExAsync(this IEnforcer enforcer, T1 value1, T2 value2, + T3 value3, T4 value4, T5 value5, T6 value6, T7 value7, T8 value8, T9 value9, T10 value10, T11 value11, + T12 value12, T13 value13, T14 value14) + { + var request = Request.CreateValues(value1, value2, value3, value4, value5, value6, value7, value8, value9, + value10, + value11, value12, value13, value14); + EnforceContext context = enforcer.CreateContext(true); + bool result = await enforcer.EnforceAsync(context, request); + return (result, context.Explanations); + } + + public static bool EnforceWithMatcher(this IEnforcer enforcer, + string matcher, T1 value1, T2 value2, T3 value3, T4 value4, T5 value5, T6 value6, T7 value7, T8 value8, + T9 value9, T10 value10, T11 value11, T12 value12, T13 value13, T14 value14) + { + var request = Request.CreateValues(value1, value2, value3, value4, value5, value6, value7, value8, value9, + value10, + value11, value12, value13, value14); + EnforceContext context = enforcer.CreateContextWithMatcher(matcher); + return enforcer.Enforce(context, request); + } + + public static Task EnforceWithMatcherAsync( + this IEnforcer enforcer, string matcher, T1 value1, T2 value2, T3 value3, T4 value4, T5 value5, T6 value6, + T7 value7, T8 value8, T9 value9, T10 value10, T11 value11, T12 value12, T13 value13, T14 value14) + { + var request = Request.CreateValues(value1, value2, value3, value4, value5, value6, value7, value8, value9, + value10, + value11, value12, value13, value14); + EnforceContext context = enforcer.CreateContextWithMatcher(matcher); + return enforcer.EnforceAsync(context, request); + } + + public static (bool Result, IEnumerable> Explains) + EnforceExWithMatcher(this IEnforcer enforcer, string matcher, + T1 value1, T2 value2, T3 value3, T4 value4, T5 value5, T6 value6, T7 value7, T8 value8, T9 value9, + T10 value10, T11 value11, T12 value12, T13 value13, T14 value14) + { + var request = Request.CreateValues(value1, value2, value3, value4, value5, value6, value7, value8, value9, + value10, + value11, value12, value13, value14); + EnforceContext context = enforcer.CreateContextWithMatcher(matcher, true); + bool result = enforcer.Enforce(context, request); + return (result, context.Explanations); + } + + public static async Task<(bool Result, IEnumerable> Explains)> + EnforceExWithMatcherAsync(this IEnforcer enforcer, + string matcher, T1 value1, T2 value2, T3 value3, T4 value4, T5 value5, T6 value6, T7 value7, T8 value8, + T9 value9, T10 value10, T11 value11, T12 value12, T13 value13, T14 value14) + { + var request = Request.CreateValues(value1, value2, value3, value4, value5, value6, value7, value8, value9, + value10, + value11, value12, value13, value14); + EnforceContext context = enforcer.CreateContextWithMatcher(matcher, true); + bool result = await enforcer.EnforceAsync(context, request); + return (result, context.Explanations); + } + + #endregion } diff --git a/Casbin/Model/Policy.cs b/Casbin/Model/Policy.cs index fa3c6e2..d791a7a 100644 --- a/Casbin/Model/Policy.cs +++ b/Casbin/Model/Policy.cs @@ -9,7 +9,7 @@ public static class Policy { public static bool SupportGeneric(int count) { - return count is >= 1 and <= 12; + return count is >= 1 and <= 14; } public static PolicyValues CreateValues(T1 value1) => new(value1); @@ -55,6 +55,18 @@ public static PolicyValues T5 value5, T6 value6, T7 value7, T8 value8, T9 value9, T10 value10, T11 value11, T12 value12) => new(value1, value2, value3, value4, value5, value6, value7, value8, value9, value10, value11, value12); + public static PolicyValues + CreateValues(T1 value1, T2 value2, T3 value3, + T4 value4, T5 value5, T6 value6, T7 value7, T8 value8, T9 value9, T10 value10, T11 value11, T12 value12, + T13 value13) => + new(value1, value2, value3, value4, value5, value6, value7, value8, value9, value10, value11, value12, value13); + + public static PolicyValues + CreateValues(T1 value1, T2 value2, T3 value3, + T4 value4, T5 value5, T6 value6, T7 value7, T8 value8, T9 value9, T10 value10, T11 value11, T12 value12, + T13 value13, T14 value14) => + new(value1, value2, value3, value4, value5, value6, value7, value8, value9, value10, value11, value12, value13, value14); + public static IPolicyValues ValuesFrom(IReadOnlyList values) => values.Count switch { @@ -88,6 +100,16 @@ public static IPolicyValues ValuesFrom(IReadOnlyList values) => values[3] ?? string.Empty, values[4] ?? string.Empty, values[5] ?? string.Empty, values[6] ?? string.Empty, values[7] ?? string.Empty, values[8] ?? string.Empty, values[9] ?? string.Empty, values[10] ?? string.Empty, values[11] ?? string.Empty), + 13 => CreateValues(values[0] ?? string.Empty, values[1] ?? string.Empty, values[2] ?? string.Empty, + values[3] ?? string.Empty, values[4] ?? string.Empty, values[5] ?? string.Empty, + values[6] ?? string.Empty, values[7] ?? string.Empty, values[8] ?? string.Empty, + values[9] ?? string.Empty, values[10] ?? string.Empty, values[11] ?? string.Empty, + values[12] ?? string.Empty), + 14 => CreateValues(values[0] ?? string.Empty, values[1] ?? string.Empty, values[2] ?? string.Empty, + values[3] ?? string.Empty, values[4] ?? string.Empty, values[5] ?? string.Empty, + values[6] ?? string.Empty, values[7] ?? string.Empty, values[8] ?? string.Empty, + values[9] ?? string.Empty, values[10] ?? string.Empty, values[11] ?? string.Empty, + values[12] ?? string.Empty, values[13] ?? string.Empty), _ => new StringListPolicyValues(values) }; @@ -136,6 +158,20 @@ public static IPolicyValues ValuesFrom(IReadOnlyList values, int require values.GetValueOrDefault(6) ?? string.Empty, values.GetValueOrDefault(7) ?? string.Empty, values.GetValueOrDefault(8) ?? string.Empty, values.GetValueOrDefault(9) ?? string.Empty, values.GetValueOrDefault(10) ?? string.Empty, values.GetValueOrDefault(11) ?? string.Empty), + 13 => CreateValues(values.GetValueOrDefault(0) ?? string.Empty, values.GetValueOrDefault(1) ?? string.Empty, + values.GetValueOrDefault(2) ?? string.Empty, values.GetValueOrDefault(3) ?? string.Empty, + values.GetValueOrDefault(4) ?? string.Empty, values.GetValueOrDefault(5) ?? string.Empty, + values.GetValueOrDefault(6) ?? string.Empty, values.GetValueOrDefault(7) ?? string.Empty, + values.GetValueOrDefault(8) ?? string.Empty, values.GetValueOrDefault(9) ?? string.Empty, + values.GetValueOrDefault(10) ?? string.Empty, values.GetValueOrDefault(11) ?? string.Empty, + values.GetValueOrDefault(12) ?? string.Empty), + 14 => CreateValues(values.GetValueOrDefault(0) ?? string.Empty, values.GetValueOrDefault(1) ?? string.Empty, + values.GetValueOrDefault(2) ?? string.Empty, values.GetValueOrDefault(3) ?? string.Empty, + values.GetValueOrDefault(4) ?? string.Empty, values.GetValueOrDefault(5) ?? string.Empty, + values.GetValueOrDefault(6) ?? string.Empty, values.GetValueOrDefault(7) ?? string.Empty, + values.GetValueOrDefault(8) ?? string.Empty, values.GetValueOrDefault(9) ?? string.Empty, + values.GetValueOrDefault(10) ?? string.Empty, values.GetValueOrDefault(11) ?? string.Empty, + values.GetValueOrDefault(12) ?? string.Empty, values.GetValueOrDefault(13) ?? string.Empty), _ => new StringListPolicyValues(values, requiredCount) }; @@ -148,7 +184,15 @@ public static IPolicyValues ValuesFrom(IEnumerable values, int requiredC public static IPolicyValues ValuesFrom(IPersistPolicy values) { int count; - if (string.IsNullOrWhiteSpace(values.Value12) is false) + if (string.IsNullOrWhiteSpace(values.Value14) is false) + { + count = 14; + } + else if (string.IsNullOrWhiteSpace(values.Value13) is false) + { + count = 13; + } + else if (string.IsNullOrWhiteSpace(values.Value12) is false) { count = 12; } @@ -223,7 +267,13 @@ public static IPolicyValues ValuesFrom(IPersistPolicy values) 12 => CreateValues(values.Value1, values.Value2, values.Value3, values.Value4, values.Value5, values.Value6, values.Value7, values.Value8, values.Value9, values.Value10, values.Value11, values.Value12), - _ => throw new ArgumentOutOfRangeException(nameof(count), count, "Count must be between 1 and 12.") + 13 => CreateValues(values.Value1, values.Value2, values.Value3, values.Value4, values.Value5, + values.Value6, values.Value7, values.Value8, values.Value9, values.Value10, values.Value11, + values.Value12, values.Value13), + 14 => CreateValues(values.Value1, values.Value2, values.Value3, values.Value4, values.Value5, + values.Value6, values.Value7, values.Value8, values.Value9, values.Value10, values.Value11, + values.Value12, values.Value13, values.Value14), + _ => throw new ArgumentOutOfRangeException(nameof(count), count, "Count must be between 1 and 14.") }; } @@ -265,8 +315,20 @@ public static IPolicyValues ValuesFrom(IPersistPolicy values, int requiredCount) values.Value6 ?? string.Empty, values.Value7 ?? string.Empty, values.Value8 ?? string.Empty, values.Value9 ?? string.Empty, values.Value10 ?? string.Empty, values.Value11 ?? string.Empty, values.Value12 ?? string.Empty), + 13 => CreateValues(values.Value1 ?? string.Empty, values.Value2 ?? string.Empty, + values.Value3 ?? string.Empty, values.Value4 ?? string.Empty, values.Value5 ?? string.Empty, + values.Value6 ?? string.Empty, values.Value7 ?? string.Empty, values.Value8 ?? string.Empty, + values.Value9 ?? string.Empty, values.Value10 ?? string.Empty, + values.Value11 ?? string.Empty, values.Value12 ?? string.Empty, + values.Value13 ?? string.Empty), + 14 => CreateValues(values.Value1 ?? string.Empty, values.Value2 ?? string.Empty, + values.Value3 ?? string.Empty, values.Value4 ?? string.Empty, values.Value5 ?? string.Empty, + values.Value6 ?? string.Empty, values.Value7 ?? string.Empty, values.Value8 ?? string.Empty, + values.Value9 ?? string.Empty, values.Value10 ?? string.Empty, + values.Value11 ?? string.Empty, values.Value12 ?? string.Empty, + values.Value13 ?? string.Empty, values.Value14 ?? string.Empty), _ => throw new ArgumentOutOfRangeException(nameof(requiredCount), requiredCount, - "Required count must be between 1 and 12.") + "Required count must be between 1 and 14.") }; public static IReadOnlyList ValuesListFrom(IEnumerable> valuesList) diff --git a/Casbin/Model/PolicyValues.cs b/Casbin/Model/PolicyValues.cs index cc38277..5daab33 100644 --- a/Casbin/Model/PolicyValues.cs +++ b/Casbin/Model/PolicyValues.cs @@ -281,13 +281,71 @@ public override IEnumerator GetEnumerator() => new PolicyEnumerator>(this); } +public record PolicyValues(T1 Value1, T2 Value2, T3 Value3, + T4 Value4, + T5 Value5, T6 Value6, T7 Value7, T8 Value8, T9 Value9, T10 Value10, T11 Value11, T12 Value12, T13 Value13) : PolicyValues +{ + public override int Count => 13; + + public override string this[int index] => index switch + { + 0 => ToStringValue(Value1), + 1 => ToStringValue(Value2), + 2 => ToStringValue(Value3), + 3 => ToStringValue(Value4), + 4 => ToStringValue(Value5), + 5 => ToStringValue(Value6), + 6 => ToStringValue(Value7), + 7 => ToStringValue(Value8), + 8 => ToStringValue(Value9), + 9 => ToStringValue(Value10), + 10 => ToStringValue(Value11), + 11 => ToStringValue(Value12), + 12 => ToStringValue(Value13), + _ => throw new ArgumentOutOfRangeException(nameof(index)) + }; + + public override IEnumerator GetEnumerator() => + new PolicyEnumerator>(this); +} + +public record PolicyValues(T1 Value1, T2 Value2, T3 Value3, + T4 Value4, + T5 Value5, T6 Value6, T7 Value7, T8 Value8, T9 Value9, T10 Value10, T11 Value11, T12 Value12, T13 Value13, T14 Value14) : PolicyValues +{ + public override int Count => 14; + + public override string this[int index] => index switch + { + 0 => ToStringValue(Value1), + 1 => ToStringValue(Value2), + 2 => ToStringValue(Value3), + 3 => ToStringValue(Value4), + 4 => ToStringValue(Value5), + 5 => ToStringValue(Value6), + 6 => ToStringValue(Value7), + 7 => ToStringValue(Value8), + 8 => ToStringValue(Value9), + 9 => ToStringValue(Value10), + 10 => ToStringValue(Value11), + 11 => ToStringValue(Value12), + 12 => ToStringValue(Value13), + 13 => ToStringValue(Value14), + _ => throw new ArgumentOutOfRangeException(nameof(index)) + }; + + public override IEnumerator GetEnumerator() => + new PolicyEnumerator>(this); +} + internal record DummyPolicyValues(string Value1 = "", string Value2 = "", string Value3 = "", string Value4 = "", string Value5 = "", string Value6 = "", string Value7 = "", string Value8 = "", string Value9 = "", - string Value10 = "", string Value11 = "", string Value12 = "") : PolicyValues + string Value10 = "", string Value11 = "", string Value12 = "", + string Value13 = "", string Value14 = "") : PolicyValues { public static new readonly DummyPolicyValues Empty = new(); - public override int Count => 12; + public override int Count => 14; public override string this[int index] => index switch { @@ -303,6 +361,8 @@ internal record DummyPolicyValues(string Value1 = "", string Value2 = "", string 9 => Value10, 10 => Value11, 11 => Value12, + 12 => Value13, + 13 => Value14, _ => "" }; diff --git a/Casbin/Model/Request.cs b/Casbin/Model/Request.cs index 8f189a0..854f55e 100644 --- a/Casbin/Model/Request.cs +++ b/Casbin/Model/Request.cs @@ -4,7 +4,7 @@ public static class Request { public static bool SupportGeneric(int count) { - return count is >= 1 and <= 12; + return count is >= 1 and <= 14; } public static RequestValues CreateValues(T value) @@ -98,6 +98,16 @@ public static RequestValues CreateValues CreateValues(T1 value1, T2 value2, T3 value3, T4 value4, T5 value5, T6 value6, T7 value7, T8 value8, T9 value9, T10 value10, T11 value11, T12 value12, T13 value13) + { + return new RequestValues(value1, value2, value3, value4, value5, value6, value7, value8, value9, value10, value11, value12, value13); + } + + public static RequestValues CreateValues(T1 value1, T2 value2, T3 value3, T4 value4, T5 value5, T6 value6, T7 value7, T8 value8, T9 value9, T10 value10, T11 value11, T12 value12, T13 value13, T14 value14) + { + return new RequestValues(value1, value2, value3, value4, value5, value6, value7, value8, value9, value10, value11, value12, value13, value14); + } + public static ListRequestValues CreateValues(params T[] value) { return new ListRequestValues(value); diff --git a/Casbin/Model/RequestValues.cs b/Casbin/Model/RequestValues.cs index 2b4ed8f..9eebfb6 100644 --- a/Casbin/Model/RequestValues.cs +++ b/Casbin/Model/RequestValues.cs @@ -778,13 +778,226 @@ public bool TrySetValue(int index, T value) } } +public struct RequestValues : IRequestValues +{ + public RequestValues(T1 value1, T2 value2, T3 value3, T4 value4, T5 value5, T6 value6, T7 value7, T8 value8, + T9 value9, T10 value10, T11 value11, T12 value12, T13 value13) + { + Value1 = value1; + Value2 = value2; + Value3 = value3; + Value4 = value4; + Value5 = value5; + Value6 = value6; + Value7 = value7; + Value8 = value8; + Value9 = value9; + Value10 = value10; + Value11 = value11; + Value12 = value12; + Value13 = value13; + } + + public T1 Value1 { get; set; } + public T2 Value2 { get; set; } + public T3 Value3 { get; set; } + public T4 Value4 { get; set; } + public T5 Value5 { get; set; } + public T6 Value6 { get; set; } + public T7 Value7 { get; set; } + public T8 Value8 { get; set; } + public T9 Value9 { get; set; } + public T10 Value10 { get; set; } + public T11 Value11 { get; set; } + public T12 Value12 { get; set; } + public T13 Value13 { get; set; } + + public string this[int index] => index switch + { + 0 => RequestValues.ToStringValue(Value1), + 1 => RequestValues.ToStringValue(Value2), + 2 => RequestValues.ToStringValue(Value3), + 3 => RequestValues.ToStringValue(Value4), + 4 => RequestValues.ToStringValue(Value5), + 5 => RequestValues.ToStringValue(Value6), + 6 => RequestValues.ToStringValue(Value7), + 7 => RequestValues.ToStringValue(Value8), + 8 => RequestValues.ToStringValue(Value9), + 9 => RequestValues.ToStringValue(Value10), + 10 => RequestValues.ToStringValue(Value11), + 11 => RequestValues.ToStringValue(Value12), + 12 => RequestValues.ToStringValue(Value13), + _ => throw new ArgumentOutOfRangeException(nameof(index)) + }; + + public int Count => 13; + + public bool TrySetValue(int index, T value) + { + switch (index) + { + case 0 when value is T1 v: + Value1 = v; + return true; + case 1 when value is T2 v: + Value2 = v; + return true; + case 2 when value is T3 v: + Value3 = v; + return true; + case 3 when value is T4 v: + Value4 = v; + return true; + case 4 when value is T5 v: + Value5 = v; + return true; + case 5 when value is T6 v: + Value6 = v; + return true; + case 6 when value is T7 v: + Value7 = v; + return true; + case 7 when value is T8 v: + Value8 = v; + return true; + case 8 when value is T9 v: + Value9 = v; + return true; + case 9 when value is T10 v: + Value10 = v; + return true; + case 10 when value is T11 v: + Value11 = v; + return true; + case 11 when value is T12 v: + Value12 = v; + return true; + case 12 when value is T13 v: + Value13 = v; + return true; + default: + return false; + } + } +} + +public struct RequestValues : IRequestValues +{ + public RequestValues(T1 value1, T2 value2, T3 value3, T4 value4, T5 value5, T6 value6, T7 value7, T8 value8, + T9 value9, T10 value10, T11 value11, T12 value12, T13 value13, T14 value14) + { + Value1 = value1; + Value2 = value2; + Value3 = value3; + Value4 = value4; + Value5 = value5; + Value6 = value6; + Value7 = value7; + Value8 = value8; + Value9 = value9; + Value10 = value10; + Value11 = value11; + Value12 = value12; + Value13 = value13; + Value14 = value14; + } + + public T1 Value1 { get; set; } + public T2 Value2 { get; set; } + public T3 Value3 { get; set; } + public T4 Value4 { get; set; } + public T5 Value5 { get; set; } + public T6 Value6 { get; set; } + public T7 Value7 { get; set; } + public T8 Value8 { get; set; } + public T9 Value9 { get; set; } + public T10 Value10 { get; set; } + public T11 Value11 { get; set; } + public T12 Value12 { get; set; } + public T13 Value13 { get; set; } + public T14 Value14 { get; set; } + + public string this[int index] => index switch + { + 0 => RequestValues.ToStringValue(Value1), + 1 => RequestValues.ToStringValue(Value2), + 2 => RequestValues.ToStringValue(Value3), + 3 => RequestValues.ToStringValue(Value4), + 4 => RequestValues.ToStringValue(Value5), + 5 => RequestValues.ToStringValue(Value6), + 6 => RequestValues.ToStringValue(Value7), + 7 => RequestValues.ToStringValue(Value8), + 8 => RequestValues.ToStringValue(Value9), + 9 => RequestValues.ToStringValue(Value10), + 10 => RequestValues.ToStringValue(Value11), + 11 => RequestValues.ToStringValue(Value12), + 12 => RequestValues.ToStringValue(Value13), + 13 => RequestValues.ToStringValue(Value14), + _ => throw new ArgumentOutOfRangeException(nameof(index)) + }; + + public int Count => 14; + + public bool TrySetValue(int index, T value) + { + switch (index) + { + case 0 when value is T1 v: + Value1 = v; + return true; + case 1 when value is T2 v: + Value2 = v; + return true; + case 2 when value is T3 v: + Value3 = v; + return true; + case 3 when value is T4 v: + Value4 = v; + return true; + case 4 when value is T5 v: + Value5 = v; + return true; + case 5 when value is T6 v: + Value6 = v; + return true; + case 6 when value is T7 v: + Value7 = v; + return true; + case 7 when value is T8 v: + Value8 = v; + return true; + case 8 when value is T9 v: + Value9 = v; + return true; + case 9 when value is T10 v: + Value10 = v; + return true; + case 10 when value is T11 v: + Value11 = v; + return true; + case 11 when value is T12 v: + Value12 = v; + return true; + case 12 when value is T13 v: + Value13 = v; + return true; + case 13 when value is T14 v: + Value14 = v; + return true; + default: + return false; + } + } +} + public struct StringRequestValues : IRequestValues { public static readonly StringRequestValues Empty = new(); public StringRequestValues(string value1 = "", string value2 = "", string value3 = "", string value4 = "", string value5 = "", string value6 = "", string value7 = "", string value8 = "", - string value9 = "", string value10 = "", string value11 = "", string value12 = "") + string value9 = "", string value10 = "", string value11 = "", string value12 = "", + string value13 = "", string value14 = "") { Value1 = value1; Value2 = value2; @@ -798,6 +1011,8 @@ public StringRequestValues(string value1 = "", string value2 = "", string value3 Value10 = value10; Value11 = value11; Value12 = value12; + Value13 = value13; + Value14 = value14; } public string Value1 { get; set; } @@ -812,25 +1027,29 @@ public StringRequestValues(string value1 = "", string value2 = "", string value3 public string Value10 { get; set; } public string Value11 { get; set; } public string Value12 { get; set; } + public string Value13 { get; set; } + public string Value14 { get; set; } public string this[int index] => index switch { - 1 => Value1, - 2 => Value2, - 3 => Value3, - 4 => Value4, - 5 => Value5, - 6 => Value6, - 7 => Value7, - 8 => Value8, - 9 => Value9, - 10 => Value10, - 11 => Value11, - 12 => Value12, + 0 => Value1, + 1 => Value2, + 2 => Value3, + 3 => Value4, + 4 => Value5, + 5 => Value6, + 6 => Value7, + 7 => Value8, + 8 => Value9, + 9 => Value10, + 10 => Value11, + 11 => Value12, + 12 => Value13, + 13 => Value14, _ => throw new ArgumentOutOfRangeException(nameof(index)) }; - public int Count => 12; + public int Count => 14; public bool TrySetValue(int index, T value) { @@ -881,6 +1100,12 @@ public bool TrySetValue(int index, string value) case 11: Value12 = value; return true; + case 12: + Value13 = value; + return true; + case 13: + Value14 = value; + return true; default: return false; } @@ -906,6 +1131,8 @@ public ListRequestValues(IEnumerable values) => public TValue Value10 => _values[9]; public TValue Value11 => _values[10]; public TValue Value12 => _values[11]; + public TValue Value13 => _values[12]; + public TValue Value14 => _values[13]; public string this[int index] => RequestValues.ToStringValue(_values[index]); public int Count => _values.Count; diff --git a/Casbin/Persist/PersistantPolicy.cs b/Casbin/Persist/PersistantPolicy.cs index 0e4e044..8bfbd8b 100644 --- a/Casbin/Persist/PersistantPolicy.cs +++ b/Casbin/Persist/PersistantPolicy.cs @@ -19,6 +19,8 @@ public class PersistPolicy : IPersistPolicy, IReadOnlyPersistPolicy public string Value10 { get; set; } public string Value11 { get; set; } public string Value12 { get; set; } + public string Value13 { get; set; } + public string Value14 { get; set; } public static TPersistPolicy Create(string type, IPolicyValues values) where TPersistPolicy : IPersistPolicy, new() @@ -135,9 +137,40 @@ public static TPersistPolicy Create(string section, string type, persistPolicy.Value11 = values[10]; persistPolicy.Value12 = values[11]; break; + case 13: + persistPolicy.Value1 = values[0]; + persistPolicy.Value2 = values[1]; + persistPolicy.Value3 = values[2]; + persistPolicy.Value4 = values[3]; + persistPolicy.Value5 = values[4]; + persistPolicy.Value6 = values[5]; + persistPolicy.Value7 = values[6]; + persistPolicy.Value8 = values[7]; + persistPolicy.Value9 = values[8]; + persistPolicy.Value10 = values[9]; + persistPolicy.Value11 = values[10]; + persistPolicy.Value12 = values[11]; + persistPolicy.Value13 = values[12]; + break; + case 14: + persistPolicy.Value1 = values[0]; + persistPolicy.Value2 = values[1]; + persistPolicy.Value3 = values[2]; + persistPolicy.Value4 = values[3]; + persistPolicy.Value5 = values[4]; + persistPolicy.Value6 = values[5]; + persistPolicy.Value7 = values[6]; + persistPolicy.Value8 = values[7]; + persistPolicy.Value9 = values[8]; + persistPolicy.Value10 = values[9]; + persistPolicy.Value11 = values[10]; + persistPolicy.Value12 = values[11]; + persistPolicy.Value13 = values[12]; + persistPolicy.Value14 = values[13]; + break; default: throw new ArgumentOutOfRangeException(nameof(values), values.Count, - "The number of values must be between 1 and 12."); + "The number of values must be between 1 and 14."); } return persistPolicy; diff --git a/Casbin/Persist/PolicyFilter.cs b/Casbin/Persist/PolicyFilter.cs index 8a51917..bf2f8e7 100644 --- a/Casbin/Persist/PolicyFilter.cs +++ b/Casbin/Persist/PolicyFilter.cs @@ -43,7 +43,7 @@ private static IQueryable FilterValues(IQueryable query, string policyType, int fieldIndex, IPolicyValues values) where T : IPersistPolicy { - if (fieldIndex > 12) + if (fieldIndex > 14) { throw new ArgumentOutOfRangeException(nameof(fieldIndex)); } @@ -56,7 +56,7 @@ private static IQueryable FilterValues(IQueryable query, int lastIndex = fieldIndex + fieldValueCount - 1; - if (lastIndex > 12) + if (lastIndex > 14) { throw new ArgumentOutOfRangeException(nameof(lastIndex)); } @@ -155,14 +155,14 @@ private static IQueryable FilterValues(IQueryable query, if (fieldIndex <= 10 && lastIndex >= 10) { - string field = values[5 - fieldIndex]; + string field = values[10 - fieldIndex]; if (string.IsNullOrWhiteSpace(field) is false) { query = query.Where(p => p.Value11 == field); } } - if (lastIndex is 11) // and fieldIndex <= 11 + if (fieldIndex <= 11 && lastIndex >= 11) { string field = values[11 - fieldIndex]; if (string.IsNullOrWhiteSpace(field) is false) @@ -171,6 +171,24 @@ private static IQueryable FilterValues(IQueryable query, } } + if (fieldIndex <= 12 && lastIndex >= 12) + { + string field = values[12 - fieldIndex]; + if (string.IsNullOrWhiteSpace(field) is false) + { + query = query.Where(p => p.Value13 == field); + } + } + + if (fieldIndex <= 13 && lastIndex >= 13) + { + string field = values[13 - fieldIndex]; + if (string.IsNullOrWhiteSpace(field) is false) + { + query = query.Where(p => p.Value14 == field); + } + } + return query; } } From c964fc4360888ffbdae3a96cbd993e71f882dbc8 Mon Sep 17 00:00:00 2001 From: Yang Luo Date: Sat, 27 Sep 2025 10:06:03 +0800 Subject: [PATCH 2/2] Update SupportCountTest.cs --- Casbin.UnitTests/GenericTests/SupportCountTest.cs | 9 --------- 1 file changed, 9 deletions(-) diff --git a/Casbin.UnitTests/GenericTests/SupportCountTest.cs b/Casbin.UnitTests/GenericTests/SupportCountTest.cs index 1da7863..7180779 100644 --- a/Casbin.UnitTests/GenericTests/SupportCountTest.cs +++ b/Casbin.UnitTests/GenericTests/SupportCountTest.cs @@ -142,13 +142,4 @@ private static IPolicyValues CreateTestPolicy(int count) return Policy.ValuesFrom(policy); } - - [Fact] - public void TestUnsupportedCount() - { - // 测试不支持的情况 - 15个参数应该抛出异常 - // 由于没有15个参数的CreateValues重载,我们需要测试SupportGeneric方法 - Assert.False(Request.SupportGeneric(15)); - Assert.False(Policy.SupportGeneric(15)); - } }