diff --git a/CHANGELOG.md b/CHANGELOG.md
index 5b545045f..83f9d4bd1 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -9,6 +9,8 @@ This document follows the conventions laid out in [Keep a CHANGELOG][].
 
 ### Added
 
+-   Added `ToPythonAs<T>()` extension method to allow for explicit conversion using a specific type. ([#2311][i2311])
+
 ### Changed
 
 ### Fixed
@@ -960,3 +962,4 @@ This version improves performance on benchmarks significantly compared to 2.3.
 [i238]: https://github.com/pythonnet/pythonnet/issues/238
 [i1481]: https://github.com/pythonnet/pythonnet/issues/1481
 [i1672]: https://github.com/pythonnet/pythonnet/pull/1672
+[i2311]: https://github.com/pythonnet/pythonnet/issues/2311
diff --git a/src/embed_tests/TestConverter.cs b/src/embed_tests/TestConverter.cs
index 0686d528b..a59b9c97b 100644
--- a/src/embed_tests/TestConverter.cs
+++ b/src/embed_tests/TestConverter.cs
@@ -185,6 +185,15 @@ public void RawPyObjectProxy()
             Assert.AreEqual(pyObject.DangerousGetAddressOrNull(), proxiedHandle);
         }
 
+        [Test]
+        public void GenericToPython()
+        {
+            int i = 42;
+            var pyObject = i.ToPythonAs<IConvertible>();
+            var type = pyObject.GetPythonType();
+            Assert.AreEqual(nameof(IConvertible), type.Name);
+        }
+
         // regression for https://github.com/pythonnet/pythonnet/issues/451
         [Test]
         public void CanGetListFromDerivedClass()
diff --git a/src/runtime/Converter.cs b/src/runtime/Converter.cs
index 412f3b711..50b33e60e 100644
--- a/src/runtime/Converter.cs
+++ b/src/runtime/Converter.cs
@@ -133,7 +133,8 @@ internal static NewReference ToPython(object? value, Type type)
             if (EncodableByUser(type, value))
             {
                 var encoded = PyObjectConversions.TryEncode(value, type);
-                if (encoded != null) {
+                if (encoded != null)
+                {
                     return new NewReference(encoded);
                 }
             }
@@ -334,7 +335,7 @@ internal static bool ToManagedValue(BorrowedReference value, Type obType,
 
             if (obType.IsGenericType && obType.GetGenericTypeDefinition() == typeof(Nullable<>))
             {
-                if( value == Runtime.PyNone )
+                if (value == Runtime.PyNone)
                 {
                     result = null;
                     return true;
@@ -980,5 +981,11 @@ public static PyObject ToPython(this object? o)
             if (o is null) return Runtime.None;
             return Converter.ToPython(o, o.GetType()).MoveToPyObject();
         }
+
+        public static PyObject ToPythonAs<T>(this T? o)
+        {
+            if (o is null) return Runtime.None;
+            return Converter.ToPython(o, typeof(T)).MoveToPyObject();
+        }
     }
 }